Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/back_end/cpp/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@ cpp_golden_test(
cpp_golden_test(
name = "no_enum_traits_golden_test",
emb_file = "//testdata:no_enum_traits.emb",
enable_enum_traits = False,
golden_file = "//testdata/golden_cpp:no_enum_traits.emb.h",
)

Expand Down
6 changes: 4 additions & 2 deletions compiler/back_end/cpp/build_defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,17 @@ def emboss_cc_test(name, copts = None, no_w_sign_compare = False, **kwargs):
**kwargs
)

def cpp_golden_test(name, emb_file, golden_file, import_dirs = []):
def cpp_golden_test(name, emb_file, golden_file, import_dirs = [], enable_enum_traits = True):
"""Defines a C++ golden file test.

Args:
name: The name of the test.
emb_file: The .emb file to test.
golden_file: The golden .h file.
import_dirs: A list of import directories.
enable_enum_traits: Whether to generate enum traits (default True).
"""
enum_traits_args = [] if enable_enum_traits else ["--no-cc-enum-traits"]
py_test(
name = name,
main = ":run_one_golden_test.py",
Expand All @@ -65,7 +67,7 @@ def cpp_golden_test(name, emb_file, golden_file, import_dirs = []):
"$(location :emboss_codegen_cpp)",
"$(location %s)" % emb_file,
"$(location %s)" % golden_file,
] + ["--import-dir=" + d for d in import_dirs],
] + ["--import-dir=" + d for d in import_dirs] + enum_traits_args,
data = [
"//compiler/front_end:emboss_front_end",
":emboss_codegen_cpp",
Expand Down
4 changes: 4 additions & 0 deletions compiler/back_end/cpp/one_golden_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ def __init__(
emb_file,
golden_file,
include_dirs=None,
enable_enum_traits=True,
):
super(OneGoldenTest, self).__init__("test_golden_file")
self.emboss_front_end = emboss_front_end
self.emboss_compiler = emboss_compiler
self.emb_file = emb_file
self.golden_file = golden_file
self.include_dirs = include_dirs if include_dirs is not None else []
self.enable_enum_traits = enable_enum_traits

def test_golden_file(self):
temp_dir = os.environ.get("TEST_TMPDIR", "")
Expand Down Expand Up @@ -61,6 +63,8 @@ def test_golden_file(self):
"--output-file",
output_path,
]
if not self.enable_enum_traits:
compiler_args.append("--no-cc-enum-traits")

process = subprocess.run(compiler_args, capture_output=True, text=True)

Expand Down
15 changes: 12 additions & 3 deletions compiler/back_end/cpp/run_one_golden_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,29 @@
def main(argv):
if len(argv) < 5:
print(
f"Usage: {argv[0]} emboss_front_end emboss_compiler emb_file golden_file [include_dir...]"
f"Usage: {argv[0]} emboss_front_end emboss_compiler emb_file golden_file [--import-dir=...] [--no-cc-enum-traits]"
)
return 1

emboss_front_end = argv[1]
emboss_compiler = argv[2]
emb_file = argv[3]
golden_file = argv[4]
include_dirs = argv[5:]
include_dirs = []
enable_enum_traits = True

for arg in argv[5:]:
if arg.startswith("--import-dir="):
# Extract just the directory path from --import-dir=<path>
include_dirs.append(arg[len("--import-dir="):])
elif arg == "--no-cc-enum-traits":
enable_enum_traits = False

suite = unittest.TestSuite()
suite.addTest(
OneGoldenTest(
emboss_front_end, emboss_compiler, emb_file, golden_file, include_dirs
emboss_front_end, emboss_compiler, emb_file, golden_file, include_dirs,
enable_enum_traits
)
)
runner = unittest.TextTestRunner()
Expand Down
163 changes: 0 additions & 163 deletions testdata/golden_cpp/no_enum_traits.emb.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@

#include "runtime/cpp/emboss_prelude.h"

#include "runtime/cpp/emboss_enum_view.h"

#include "runtime/cpp/emboss_text_util.h"



/* NOLINTBEGIN */
Expand All @@ -38,79 +34,6 @@ enum class Foo : ::std::uint64_t {
VALUE = static_cast</**/::std::int32_t>(10LL),

};
template <class Enum>
class EnumTraits;

template <>
class EnumTraits<Foo> final {
public:
static bool TryToGetEnumFromName(const char *emboss_reserved_local_name,
Foo *emboss_reserved_local_result) {
if (emboss_reserved_local_name == nullptr) return false;
if (!strcmp("VALUE", emboss_reserved_local_name)) {
*emboss_reserved_local_result = Foo::VALUE;
return true;
}

return false;
}

static const char *TryToGetNameFromEnum(
Foo emboss_reserved_local_value) {
switch (emboss_reserved_local_value) {
case Foo::VALUE: return "VALUE";

default: return nullptr;
}
}

static bool EnumIsKnown(Foo emboss_reserved_local_value) {
switch (emboss_reserved_local_value) {
case Foo::VALUE: return true;

default:
return false;
}
}

static ::std::ostream &SendToOstream(::std::ostream &emboss_reserved_local_os,
Foo emboss_reserved_local_value) {
const char *emboss_reserved_local_name =
TryToGetNameFromEnum(emboss_reserved_local_value);
if (emboss_reserved_local_name == nullptr) {
emboss_reserved_local_os
<< static_cast</**/ ::std::underlying_type<Foo>::type>(
emboss_reserved_local_value);
} else {
emboss_reserved_local_os << emboss_reserved_local_name;
}
return emboss_reserved_local_os;
}
};

static inline bool TryToGetEnumFromName(
const char *emboss_reserved_local_name,
Foo *emboss_reserved_local_result) {
return EnumTraits<Foo>::TryToGetEnumFromName(
emboss_reserved_local_name, emboss_reserved_local_result);
}

static inline const char *TryToGetNameFromEnum(
Foo emboss_reserved_local_value) {
return EnumTraits<Foo>::TryToGetNameFromEnum(
emboss_reserved_local_value);
}

static inline bool EnumIsKnown(Foo emboss_reserved_local_value) {
return EnumTraits<Foo>::EnumIsKnown(emboss_reserved_local_value);
}

static inline ::std::ostream &operator<<(
::std::ostream &emboss_reserved_local_os,
Foo emboss_reserved_local_value) {
return EnumTraits<Foo>::SendToOstream(emboss_reserved_local_os,
emboss_reserved_local_value);
}



Expand Down Expand Up @@ -265,92 +188,6 @@ class GenericBarView final {
emboss_reserved_local_other.IntrinsicSizeInBytes().Read());
}

template <class Stream>
bool UpdateFromTextStream(Stream *emboss_reserved_local_stream) const {
::std::string emboss_reserved_local_brace;
if (!::emboss::support::ReadToken(emboss_reserved_local_stream,
&emboss_reserved_local_brace))
return false;
if (emboss_reserved_local_brace != "{") return false;
for (;;) {
::std::string emboss_reserved_local_name;
if (!::emboss::support::ReadToken(emboss_reserved_local_stream,
&emboss_reserved_local_name))
return false;
if (emboss_reserved_local_name == ",")
if (!::emboss::support::ReadToken(emboss_reserved_local_stream,
&emboss_reserved_local_name))
return false;
if (emboss_reserved_local_name == "}") return true;
::std::string emboss_reserved_local_colon;
if (!::emboss::support::ReadToken(emboss_reserved_local_stream,
&emboss_reserved_local_colon))
return false;
if (emboss_reserved_local_colon != ":") return false;
if (emboss_reserved_local_name == "foo") {
if (!foo().UpdateFromTextStream(
emboss_reserved_local_stream)) {
return false;
}
continue;
}

return false;
}
}

template <class Stream>
void WriteToTextStream(
Stream *emboss_reserved_local_stream,
::emboss::TextOutputOptions emboss_reserved_local_options) const {
::emboss::TextOutputOptions emboss_reserved_local_field_options =
emboss_reserved_local_options.PlusOneIndent();
if (emboss_reserved_local_options.multiline()) {
emboss_reserved_local_stream->Write("{\n");
} else {
emboss_reserved_local_stream->Write("{");
}
bool emboss_reserved_local_wrote_field = false;
if (has_foo().ValueOr(false)) {
if (!emboss_reserved_local_field_options.allow_partial_output() ||
foo().IsAggregate() || foo().Ok()) {
if (emboss_reserved_local_field_options.multiline()) {
emboss_reserved_local_stream->Write(
emboss_reserved_local_field_options.current_indent());
} else {
if (emboss_reserved_local_wrote_field) {
emboss_reserved_local_stream->Write(",");
}
emboss_reserved_local_stream->Write(" ");
}
emboss_reserved_local_stream->Write("foo: ");
foo().WriteToTextStream(emboss_reserved_local_stream,
emboss_reserved_local_field_options);
emboss_reserved_local_wrote_field = true;
if (emboss_reserved_local_field_options.multiline()) {
emboss_reserved_local_stream->Write("\n");
}
} else if (emboss_reserved_local_field_options.allow_partial_output() &&
emboss_reserved_local_field_options.comments() &&
!foo().IsAggregate() && !foo().Ok()) {
if (emboss_reserved_local_field_options.multiline()) {
emboss_reserved_local_stream->Write(
emboss_reserved_local_field_options.current_indent());
}
emboss_reserved_local_stream->Write("# foo: UNREADABLE\n");
}
}

(void)emboss_reserved_local_wrote_field;
if (emboss_reserved_local_options.multiline()) {
emboss_reserved_local_stream->Write(
emboss_reserved_local_options.current_indent());
emboss_reserved_local_stream->Write("}");
} else {
emboss_reserved_local_stream->Write(" }");
}
}



static constexpr bool IsAggregate() { return true; }
Expand Down