enumertion: Add a using declaration rather than qualifying all branches.

This commit is contained in:
Emilio Cobos Álvarez
2020-10-01 12:24:14 +02:00
parent 2be47c88e6
commit 36a3f8ba6e
2 changed files with 43 additions and 27 deletions
+27 -15
View File
@@ -759,6 +759,17 @@ impl Source for Enum {
);
out.open_brace();
if is_tagged {
// C++ name resolution rules are weird.
write!(
out,
"using {} = {}::{};",
enum_name,
self.export_name(),
enum_name
);
out.new_line();
}
write!(out, "switch ({})", instance);
out.open_brace();
let vec: Vec<_> = self
@@ -766,13 +777,8 @@ impl Source for Enum {
.iter()
.map(|x| {
format!(
"case {}{}{}::{}: {} << \"{}\"; break;",
if is_tagged { self.export_name() } else { "" },
if is_tagged { "::" } else { "" },
enum_name,
x.export_name,
stream,
x.export_name
"case {}::{}: {} << \"{}\"; break;",
enum_name, x.export_name, stream, x.export_name
)
})
.collect();
@@ -797,6 +803,17 @@ impl Source for Enum {
);
out.open_brace();
// C++ name resolution rules are weird.
write!(
out,
"using {} = {}::{};",
enum_name,
self.export_name(),
enum_name
);
out.new_line();
write!(out, "switch ({}.tag)", instance);
out.open_brace();
let vec: Vec<_> = self
@@ -806,8 +823,7 @@ impl Source for Enum {
let tag_str = format!("\"{}\"", x.export_name);
if let VariantBody::Body { ref name, .. } = x.body {
format!(
"case {}::{}::{}: {} << {}{}{}.{}; break;",
self.export_name(),
"case {}::{}: {} << {}{}{}.{}; break;",
enum_name,
x.export_name,
stream,
@@ -818,12 +834,8 @@ impl Source for Enum {
)
} else {
format!(
"case {}::{}::{}: {} << {}; break;",
self.export_name(),
enum_name,
x.export_name,
stream,
tag_str,
"case {}::{}: {} << {}; break;",
enum_name, x.export_name, stream, tag_str,
)
}
})
+16 -12
View File
@@ -55,19 +55,21 @@ union F {
};
friend std::ostream& operator<<(std::ostream& stream, const Tag& instance) {
using Tag = F::Tag;
switch (instance) {
case F::Tag::Foo: stream << "Foo"; break;
case F::Tag::Bar: stream << "Bar"; break;
case F::Tag::Baz: stream << "Baz"; break;
case Tag::Foo: stream << "Foo"; break;
case Tag::Bar: stream << "Bar"; break;
case Tag::Baz: stream << "Baz"; break;
}
return stream;
}
friend std::ostream& operator<<(std::ostream& stream, const F& instance) {
using Tag = F::Tag;
switch (instance.tag) {
case F::Tag::Foo: stream << instance.foo; break;
case F::Tag::Bar: stream << instance.bar; break;
case F::Tag::Baz: stream << "Baz"; break;
case Tag::Foo: stream << instance.foo; break;
case Tag::Bar: stream << instance.bar; break;
case Tag::Baz: stream << "Baz"; break;
}
return stream;
}
@@ -109,19 +111,21 @@ struct H {
};
friend std::ostream& operator<<(std::ostream& stream, const Tag& instance) {
using Tag = H::Tag;
switch (instance) {
case H::Tag::Hello: stream << "Hello"; break;
case H::Tag::There: stream << "There"; break;
case H::Tag::Everyone: stream << "Everyone"; break;
case Tag::Hello: stream << "Hello"; break;
case Tag::There: stream << "There"; break;
case Tag::Everyone: stream << "Everyone"; break;
}
return stream;
}
friend std::ostream& operator<<(std::ostream& stream, const H& instance) {
using Tag = H::Tag;
switch (instance.tag) {
case H::Tag::Hello: stream << "Hello" << instance.hello; break;
case H::Tag::There: stream << "There" << instance.there; break;
case H::Tag::Everyone: stream << "Everyone"; break;
case Tag::Hello: stream << "Hello" << instance.hello; break;
case Tag::There: stream << "There" << instance.there; break;
case Tag::Everyone: stream << "Everyone"; break;
}
return stream;
}