diff --git a/executable_semantics/ast/expression.cpp b/executable_semantics/ast/expression.cpp index 8ed510b346c6..7a7cf0ab85e1 100644 --- a/executable_semantics/ast/expression.cpp +++ b/executable_semantics/ast/expression.cpp @@ -5,6 +5,7 @@ #include "executable_semantics/ast/expression.h" #include "executable_semantics/common/error.h" +#include "llvm/ADT/StringExtras.h" namespace Carbon { @@ -221,12 +222,9 @@ static void PrintOp(llvm::raw_ostream& out, Operator op) { static void PrintFields(llvm::raw_ostream& out, const std::vector& fields) { - int i = 0; - for (auto iter = fields.begin(); iter != fields.end(); ++iter, ++i) { - if (i != 0) { - out << ", "; - } - out << iter->name << " = " << *iter->expression; + llvm::ListSeparator sep; + for (const auto& field : fields) { + out << sep << field.name << " = " << field.expression; } } diff --git a/executable_semantics/interpreter/action.cpp b/executable_semantics/interpreter/action.cpp index c5a1843bf591..d25e46486cc2 100644 --- a/executable_semantics/interpreter/action.cpp +++ b/executable_semantics/interpreter/action.cpp @@ -13,6 +13,7 @@ #include "executable_semantics/ast/expression.h" #include "executable_semantics/ast/function_definition.h" #include "executable_semantics/interpreter/stack.h" +#include "llvm/ADT/StringExtras.h" namespace Carbon { @@ -74,24 +75,21 @@ void Action::Print(llvm::raw_ostream& out) const { out << "<" << pos << ">"; if (results.size() > 0) { out << "("; + llvm::ListSeparator sep; for (auto& result : results) { + out << sep; if (result) { out << *result; } - out << ","; } out << ")"; } } void Action::PrintList(const Stack& ls, llvm::raw_ostream& out) { - auto it = ls.begin(); - while (it != ls.end()) { - out << **it; - ++it; - if (it != ls.end()) { - out << " :: "; - } + llvm::ListSeparator sep(" :: "); + for (const auto& action : ls) { + out << sep << *action; } } diff --git a/executable_semantics/interpreter/heap.cpp b/executable_semantics/interpreter/heap.cpp index c8b6305fb538..03a7897f657c 100644 --- a/executable_semantics/interpreter/heap.cpp +++ b/executable_semantics/interpreter/heap.cpp @@ -4,6 +4,8 @@ #include "executable_semantics/interpreter/heap.h" +#include "llvm/ADT/StringExtras.h" + namespace Carbon { auto Heap::AllocateValue(const Value* v) -> Address { @@ -48,9 +50,10 @@ void Heap::Deallocate(const Address& address) { } void Heap::Print(llvm::raw_ostream& out) const { + llvm::ListSeparator sep; for (size_t i = 0; i < values_.size(); ++i) { + out << sep; PrintAddress(Address(i), out); - out << ", "; } } diff --git a/executable_semantics/interpreter/interpreter.cpp b/executable_semantics/interpreter/interpreter.cpp index 1f933a0d5b1d..b6ec23ef63c1 100644 --- a/executable_semantics/interpreter/interpreter.cpp +++ b/executable_semantics/interpreter/interpreter.cpp @@ -18,6 +18,7 @@ #include "executable_semantics/interpreter/action.h" #include "executable_semantics/interpreter/frame.h" #include "executable_semantics/interpreter/stack.h" +#include "llvm/ADT/StringExtras.h" namespace Carbon { @@ -31,10 +32,10 @@ void Step(); // void PrintEnv(Env values, llvm::raw_ostream& out) { + llvm::ListSeparator sep; for (const auto& [name, address] : values) { - out << name << ": "; + out << sep << name << ": "; state->heap.PrintAddress(address, out); - out << ", "; } } @@ -43,13 +44,9 @@ void PrintEnv(Env values, llvm::raw_ostream& out) { // void PrintStack(const Stack& ls, llvm::raw_ostream& out) { - auto it = ls.begin(); - while (it != ls.end()) { - out << **it; - ++it; - if (it != ls.end()) { - out << " :: "; - } + llvm::ListSeparator sep(" :: "); + for (const auto& frame : ls) { + out << sep << *frame; } } diff --git a/executable_semantics/interpreter/value.cpp b/executable_semantics/interpreter/value.cpp index 499229e25f31..69090836c6b5 100644 --- a/executable_semantics/interpreter/value.cpp +++ b/executable_semantics/interpreter/value.cpp @@ -7,6 +7,7 @@ #include #include "common/check.h" +#include "llvm/ADT/StringExtras.h" namespace Carbon { @@ -373,15 +374,9 @@ void Value::Print(llvm::raw_ostream& out) const { } case ValKind::TupleValue: { out << "("; - bool add_commas = false; + llvm::ListSeparator sep; for (const TupleElement& element : GetTupleValue().elements) { - if (add_commas) { - out << ", "; - } else { - add_commas = true; - } - - out << element.name << " = " << *element.value; + out << sep << element.name << " = " << *element.value; } out << ")"; break;