Revert "Speed-up GN with custom OutputStream interface." This reverts commit 2dd9331a704147be787823a169de51df8d3526bb. Reason for revert: Breaks chromium build. Original change's description: > Speed-up GN with custom OutputStream interface. > > For legacy reasons, std::ostream is a very inefficient > interface for appending text to an output stream, something > that GN does a lot. > > This CL speeds GN by: > > - Introducing a new OutputStream abstract class to replace > std::ostream entirely. It provides the same API subset needed > by the rest of the code to minimize changes. > See gn/output_stream.h. > > - Adding StringOutputStream, a concrete OutputStream to store > the result into an std::stream. This replaces > std::ostringstream. See gn/output_stream.h. > > - Adding FileOutputStream, a concrete OutputStream to store > the result into a file. This replaces std::ofstream. > See gn/output_stream.h. > > - Making StringOutputBuffer an OutputStream derived class > as well, simplify its use as an output destination > for many calls. > > - Adjusting all call sites appropriately. > > - Replace `out << std::endl` statements with > `out << "\n"` as the type of `std::endl` is unspecified > by the standard and hard to guess at compile time for > implementing an OutputStream::operator<< overload. > > - Remove obsolete `#include <sstream>` statements > from the sources. Same for `<fstream>`. > > Benchmarking shows that on Linux, this saves about 6% of > `gn gen` time for a small Fuchsia build graph > (6.27s -> 5.90s), and that the stripped LTO-optimized > executable, is reduced by about 50 kiB. > > Change-Id: I00c7e1db67c59ab57c64756382683159df0662a6 > Reviewed-on: https://gn-review.googlesource.com/c/gn/+/18140 > Reviewed-by: Dirk Pranke <dpranke@google.com> > Commit-Queue: David Turner <digit@google.com> TBR=dpranke@google.com,tikuta@google.com,digit@google.com,gn-scoped@luci-project-accounts.iam.gserviceaccount.com Change-Id: I8c451f9b698f0e0fbcea843a903c5e6148e8df18 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://gn-review.googlesource.com/c/gn/+/18160 Commit-Queue: Dirk Pranke <dpranke@google.com> Reviewed-by: Dirk Pranke <dpranke@google.com> Reviewed-by: Takuto Ikuta <tikuta@google.com>
diff --git a/build/gen.py b/build/gen.py index e13d194..d1c649c 100755 --- a/build/gen.py +++ b/build/gen.py
@@ -732,7 +732,6 @@ 'src/gn/operators.cc', 'src/gn/output_conversion.cc', 'src/gn/output_file.cc', - 'src/gn/output_stream.cc', 'src/gn/parse_node_value_adapter.cc', 'src/gn/parse_tree.cc', 'src/gn/parser.cc', @@ -858,7 +857,6 @@ 'src/gn/ninja_toolchain_writer_unittest.cc', 'src/gn/operators_unittest.cc', 'src/gn/output_conversion_unittest.cc', - 'src/gn/output_stream_unittest.cc', 'src/gn/parse_tree_unittest.cc', 'src/gn/parser_unittest.cc', 'src/gn/path_output_unittest.cc',
diff --git a/src/gn/command_desc.cc b/src/gn/command_desc.cc index 13a82db..b50d4e9 100644 --- a/src/gn/command_desc.cc +++ b/src/gn/command_desc.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <memory> #include <set> +#include <sstream> #include "base/command_line.h" #include "base/json/json_writer.h"
diff --git a/src/gn/command_format.cc b/src/gn/command_format.cc index 75c3741..1a6f9ec 100644 --- a/src/gn/command_format.cc +++ b/src/gn/command_format.cc
@@ -6,6 +6,8 @@ #include <stddef.h> +#include <sstream> + #include "base/command_line.h" #include "base/files/file_util.h" #include "base/json/json_reader.h" @@ -15,7 +17,6 @@ #include "gn/commands.h" #include "gn/filesystem_utils.h" #include "gn/input_file.h" -#include "gn/output_stream.h" #include "gn/parser.h" #include "gn/scheduler.h" #include "gn/setup.h" @@ -1239,7 +1240,7 @@ std::string* output, std::string* dump_output) { if (dump_tree == TreeDumpMode::kPlainText) { - StringOutputStream os; + std::ostringstream os; RenderToText(root->GetJSONNode(), 0, os); *dump_output = os.str(); } else if (dump_tree == TreeDumpMode::kJSON) {
diff --git a/src/gn/compile_commands_writer.cc b/src/gn/compile_commands_writer.cc index 5dd8270..23d6029 100644 --- a/src/gn/compile_commands_writer.cc +++ b/src/gn/compile_commands_writer.cc
@@ -4,6 +4,8 @@ #include "gn/compile_commands_writer.h" +#include <sstream> + #include "base/json/string_escape.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" @@ -14,7 +16,6 @@ #include "gn/deps_iterator.h" #include "gn/escape.h" #include "gn/ninja_target_command_util.h" -#include "gn/output_stream.h" #include "gn/path_output.h" #include "gn/string_output_buffer.h" #include "gn/substitution_writer.h" @@ -61,7 +62,7 @@ const std::vector<T>& (ConfigValues::*getter)() const, const Writer& writer) { std::string result; - StringOutputStream out; + std::ostringstream out; RecursiveTargetConfigToStream<T>(config, target, getter, writer, out); base::EscapeJSONString(out.str(), false, &result); return result; @@ -101,7 +102,7 @@ const std::vector<std::string>& (ConfigValues::*getter)() const) -> std::string { std::string result; - StringOutputStream out; + std::ostringstream out; WriteOneFlag(config, target, substitution, has_precompiled_headers, tool_name, getter, opts, path_output, out, /*write_substitution=*/false, /*indent=*/false); @@ -132,12 +133,13 @@ void WriteFile(const SourceFile& source, PathOutput& path_output, - OutputStream& out) { + std::ostream& out) { + std::ostringstream rel_source_path; out << " \"file\": \""; path_output.WriteFile(out, source); } -void WriteDirectory(std::string build_dir, OutputStream& out) { +void WriteDirectory(std::string build_dir, std::ostream& out) { out << "\","; out << kPrettyPrintLineEnding; out << " \"directory\": \""; @@ -153,7 +155,7 @@ SourceFile::Type source_type, const char* tool_name, EscapeOptions opts, - OutputStream& out) { + std::ostream& out) { EscapeOptions no_quoting(opts); no_quoting.inhibit_quoting = true; const Tool* tool = target->toolchain()->GetTool(tool_name); @@ -221,7 +223,7 @@ void OutputJSON(const BuildSettings* build_settings, std::vector<const Target*>& all_targets, - OutputStream& out) { + std::ostream& out) { out << '['; out << kPrettyPrintLineEnding; bool first = true; @@ -289,8 +291,9 @@ std::string CompileCommandsWriter::RenderJSON( const BuildSettings* build_settings, std::vector<const Target*>& all_targets) { - StringOutputStream json; - OutputJSON(build_settings, all_targets, json); + StringOutputBuffer json; + std::ostream out(&json); + OutputJSON(build_settings, all_targets, out); return json.str(); } @@ -307,7 +310,8 @@ return false; StringOutputBuffer json; - OutputJSON(build_settings, to_write, json); + std::ostream output_to_json(&json); + OutputJSON(build_settings, to_write, output_to_json); return json.WriteToFileIfChanged(output_path, err); }
diff --git a/src/gn/compile_commands_writer_unittest.cc b/src/gn/compile_commands_writer_unittest.cc index 7e2ca28..2f0294c 100644 --- a/src/gn/compile_commands_writer_unittest.cc +++ b/src/gn/compile_commands_writer_unittest.cc
@@ -5,6 +5,7 @@ #include "gn/compile_commands_writer.h" #include <memory> +#include <sstream> #include <utility> #include "gn/config.h"
diff --git a/src/gn/config_values_extractors.cc b/src/gn/config_values_extractors.cc index 58458ad..a369008 100644 --- a/src/gn/config_values_extractors.cc +++ b/src/gn/config_values_extractors.cc
@@ -5,7 +5,6 @@ #include "gn/config_values_extractors.h" #include "gn/escape.h" -#include "gn/output_stream.h" namespace { @@ -14,7 +13,7 @@ explicit EscapedStringWriter(const EscapeOptions& escape_options) : escape_options_(escape_options) {} - void operator()(const std::string& s, OutputStream& out) const { + void operator()(const std::string& s, std::ostream& out) const { out << " "; EscapeStringToStream(out, s, escape_options_); } @@ -30,7 +29,7 @@ const Target* target, const std::vector<std::string>& (ConfigValues::*getter)() const, const EscapeOptions& escape_options, - OutputStream& out) { + std::ostream& out) { RecursiveTargetConfigToStream(config, target, getter, EscapedStringWriter(escape_options), out); }
diff --git a/src/gn/config_values_extractors.h b/src/gn/config_values_extractors.h index ae4c862..45b1f25 100644 --- a/src/gn/config_values_extractors.h +++ b/src/gn/config_values_extractors.h
@@ -17,8 +17,6 @@ struct EscapeOptions; -class OutputStream; - // Provides a way to iterate through all ConfigValues applying to a given // target. This is more complicated than normal because the target has a list // of configs applying to it, and also config values on the target itself. @@ -89,7 +87,7 @@ const Target* target, const std::vector<T>& (ConfigValues::*getter)() const, const Writer& writer, - OutputStream& out) { + std::ostream& out) { std::set<T> seen; for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) { const std::vector<T>& values = ((iter.cur()).*getter)(); @@ -115,6 +113,6 @@ const Target* target, const std::vector<std::string>& (ConfigValues::*getter)() const, const EscapeOptions& escape_options, - OutputStream& out); + std::ostream& out); #endif // TOOLS_GN_CONFIG_VALUES_EXTRACTORS_H_
diff --git a/src/gn/config_values_extractors_unittest.cc b/src/gn/config_values_extractors_unittest.cc index c27107d..3db4bff 100644 --- a/src/gn/config_values_extractors_unittest.cc +++ b/src/gn/config_values_extractors_unittest.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/config_values_extractors.h" +#include <sstream> #include "gn/config.h" -#include "gn/output_stream.h" +#include "gn/config_values_extractors.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -13,13 +13,13 @@ namespace { struct FlagWriter { - void operator()(const std::string& dir, OutputStream& out) const { + void operator()(const std::string& dir, std::ostream& out) const { out << dir << " "; } }; struct IncludeWriter { - void operator()(const SourceDir& dir, OutputStream& out) const { + void operator()(const SourceDir& dir, std::ostream& out) const { out << dir.value() << " "; } }; @@ -128,7 +128,7 @@ ASSERT_TRUE(target.OnResolved(&err)); // Verify cflags by serializing. - StringOutputStream flag_out; + std::ostringstream flag_out; FlagWriter flag_writer; RecursiveTargetConfigToStream<std::string, FlagWriter>( kRecursiveWriterKeepDuplicates, &target, &ConfigValues::cflags, @@ -138,7 +138,7 @@ "--dep1-all --dep1-all-sub --dep2-all --dep2-all --dep1-direct "); // Verify include dirs by serializing. - StringOutputStream include_out; + std::ostringstream include_out; IncludeWriter include_writer; RecursiveTargetConfigToStream<SourceDir, IncludeWriter>( kRecursiveWriterSkipDuplicates, &target, &ConfigValues::include_dirs,
diff --git a/src/gn/eclipse_writer.cc b/src/gn/eclipse_writer.cc index 5da2b12..0067f6d 100644 --- a/src/gn/eclipse_writer.cc +++ b/src/gn/eclipse_writer.cc
@@ -4,6 +4,7 @@ #include "gn/eclipse_writer.h" +#include <fstream> #include <memory> #include "base/files/file_path.h" @@ -11,7 +12,6 @@ #include "gn/config_values_extractors.h" #include "gn/filesystem_utils.h" #include "gn/loader.h" -#include "gn/output_stream.h" #include "gn/xml_element_writer.h" namespace { @@ -37,7 +37,7 @@ EclipseWriter::EclipseWriter(const BuildSettings* build_settings, const Builder& builder, - OutputStream& out) + std::ostream& out) : build_settings_(build_settings), builder_(builder), out_(out) { languages_.push_back("C++ Source File"); languages_.push_back("C Source File"); @@ -55,7 +55,9 @@ Err* err) { base::FilePath file = build_settings->GetFullPath(build_settings->build_dir()) .AppendASCII("eclipse-cdt-settings.xml"); - FileOutputStream file_out(FilePathToUTF8(file).c_str()); + std::ofstream file_out; + file_out.open(FilePathToUTF8(file).c_str(), + std::ios_base::out | std::ios_base::binary); if (file_out.fail()) { *err = Err(Location(), "Couldn't open eclipse-cdt-settings.xml for writing"); @@ -117,7 +119,7 @@ } void EclipseWriter::WriteCDTSettings() { - out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; XmlElementWriter cdt_properties_element(out_, "cdtprojectproperties", XmlAttributes());
diff --git a/src/gn/eclipse_writer.h b/src/gn/eclipse_writer.h index 17b515f..6b71a51 100644 --- a/src/gn/eclipse_writer.h +++ b/src/gn/eclipse_writer.h
@@ -14,7 +14,6 @@ class BuildSettings; class Builder; class Err; -class OutputStream; class Target; class EclipseWriter { @@ -26,7 +25,7 @@ private: EclipseWriter(const BuildSettings* build_settings, const Builder& builder, - OutputStream& out); + std::ostream& out); ~EclipseWriter(); void Run(); @@ -49,7 +48,7 @@ const Builder& builder_; // The output stream for the settings file. - OutputStream& out_; + std::ostream& out_; // Eclipse languages for which the include dirs and defines apply. std::vector<std::string> languages_;
diff --git a/src/gn/escape.cc b/src/gn/escape.cc index 56ae6de..687c92a 100644 --- a/src/gn/escape.cc +++ b/src/gn/escape.cc
@@ -11,7 +11,6 @@ #include "base/compiler_specific.h" #include "base/json/string_escape.h" #include "base/logging.h" -#include "gn/output_stream.h" #include "util/build_config.h" namespace { @@ -295,14 +294,14 @@ EscapeStringToString(str, options, dest, needed_quoting)); } -void EscapeStringToStream(OutputStream& out, +void EscapeStringToStream(std::ostream& out, std::string_view str, const EscapeOptions& options) { StackOrHeapBuffer dest(str.size() * kMaxEscapedCharsPerChar); out.write(dest, EscapeStringToString(str, options, dest, nullptr)); } -void EscapeJSONStringToStream(OutputStream& out, +void EscapeJSONStringToStream(std::ostream& out, std::string_view str, const EscapeOptions& options) { std::string dest;
diff --git a/src/gn/escape.h b/src/gn/escape.h index 1fc87a5..c46d42d 100644 --- a/src/gn/escape.h +++ b/src/gn/escape.h
@@ -5,11 +5,10 @@ #ifndef TOOLS_GN_ESCAPE_H_ #define TOOLS_GN_ESCAPE_H_ +#include <iosfwd> #include <string_view> #include <string> -class OutputStream; - enum EscapingMode { // No escaping. ESCAPE_NONE, @@ -79,13 +78,13 @@ // Same as EscapeString but writes the results to the given stream, saving a // copy. -void EscapeStringToStream(OutputStream& out, +void EscapeStringToStream(std::ostream& out, std::string_view str, const EscapeOptions& options); // Same as EscapeString but escape JSON string and writes the results to the // given stream, saving a copy. -void EscapeJSONStringToStream(OutputStream& out, +void EscapeJSONStringToStream(std::ostream& out, std::string_view str, const EscapeOptions& options);
diff --git a/src/gn/escape_unittest.cc b/src/gn/escape_unittest.cc index 0f32075..004498e 100644 --- a/src/gn/escape_unittest.cc +++ b/src/gn/escape_unittest.cc
@@ -3,7 +3,7 @@ // found in the LICENSE file. #include "gn/escape.h" -#include "gn/output_stream.h" +#include "gn/string_output_buffer.h" #include "util/test/test.h" TEST(Escape, Ninja) { @@ -85,17 +85,20 @@ opts.mode = ESCAPE_NINJA_PREFORMATTED_COMMAND; opts.inhibit_quoting = true; - StringOutputStream buffer; + StringOutputBuffer buffer; + std::ostream out(&buffer); - EscapeJSONStringToStream(buffer, "foo\\\" bar", opts); + EscapeJSONStringToStream(out, "foo\\\" bar", opts); EXPECT_EQ("foo\\\\\\\" bar", buffer.str()); - StringOutputStream buffer1; - EscapeJSONStringToStream(buffer1, "foo bar\\\\", opts); + StringOutputBuffer buffer1; + std::ostream out1(&buffer1); + EscapeJSONStringToStream(out1, "foo bar\\\\", opts); EXPECT_EQ("foo bar\\\\\\\\", buffer1.str()); - StringOutputStream buffer2; - EscapeJSONStringToStream(buffer2, "a: \"$\\b", opts); + StringOutputBuffer buffer2; + std::ostream out2(&buffer2); + EscapeJSONStringToStream(out2, "a: \"$\\b", opts); EXPECT_EQ("a: \\\"$$\\\\b", buffer2.str()); }
diff --git a/src/gn/function_write_file.cc b/src/gn/function_write_file.cc index d79f4df..709f5fb 100644 --- a/src/gn/function_write_file.cc +++ b/src/gn/function_write_file.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <sstream> + #include "base/files/file_util.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -12,7 +14,6 @@ #include "gn/functions.h" #include "gn/input_file.h" #include "gn/output_conversion.h" -#include "gn/output_stream.h" #include "gn/parse_tree.h" #include "gn/scheduler.h" #include "gn/string_output_buffer.h" @@ -89,7 +90,8 @@ // Compute output. StringOutputBuffer storage; - ConvertValueToOutput(scope->settings(), args[1], output_conversion, storage, + std::ostream contents(&storage); + ConvertValueToOutput(scope->settings(), args[1], output_conversion, contents, err); if (err->has_error()) return Value();
diff --git a/src/gn/header_checker_unittest.cc b/src/gn/header_checker_unittest.cc index 74d99cc..00a82d3 100644 --- a/src/gn/header_checker_unittest.cc +++ b/src/gn/header_checker_unittest.cc
@@ -7,7 +7,6 @@ #include "gn/config.h" #include "gn/header_checker.h" -#include "gn/output_stream.h" #include "gn/scheduler.h" #include "gn/target.h" #include "gn/test_with_scheduler.h" @@ -76,7 +75,7 @@ } // namespace -void PrintTo(const SourceFile& source_file, OutputStream* os) { +void PrintTo(const SourceFile& source_file, ::std::ostream* os) { *os << source_file.value(); }
diff --git a/src/gn/ninja_action_target_writer.cc b/src/gn/ninja_action_target_writer.cc index e479c90..0fe0c1b 100644 --- a/src/gn/ninja_action_target_writer.cc +++ b/src/gn/ninja_action_target_writer.cc
@@ -10,7 +10,6 @@ #include "gn/deps_iterator.h" #include "gn/err.h" #include "gn/general_tool.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/settings.h" #include "gn/string_utils.h" @@ -18,7 +17,7 @@ #include "gn/target.h" NinjaActionTargetWriter::NinjaActionTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out), path_output_no_escaping_( target->settings()->build_settings()->build_dir(), @@ -76,7 +75,7 @@ target_->output_type() == Target::ACTION ? 1u : target_->sources().size(); std::vector<OutputFile> input_deps = WriteInputDepsStampOrPhonyAndGetDep( additional_hard_deps, num_output_uses); - out_ << "\n"; + out_ << std::endl; // Collects all output files for writing below. std::vector<OutputFile> output_files; @@ -109,7 +108,7 @@ path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; if (target_->action_values().has_depfile()) { WriteDepfile(SourceFile()); } @@ -120,10 +119,10 @@ out_ << " pool = "; out_ << target_->pool().ptr->GetNinjaName( settings_->default_toolchain_label()); - out_ << "\n"; + out_ << std::endl; } } - out_ << "\n"; + out_ << std::endl; // Write the phony, which doesn't need to depend on the data deps because they // have been added as order-only deps of the action output itself. @@ -148,7 +147,7 @@ EscapeOptions args_escape_options; args_escape_options.mode = ESCAPE_NINJA_COMMAND; - out_ << "rule " << custom_rule_name << "\n"; + out_ << "rule " << custom_rule_name << std::endl; if (target_->action_values().uses_rsp_file()) { // Needs a response file. The unique_name part is for action_foreach so @@ -159,7 +158,7 @@ if (!target_->sources().empty()) rspfile += ".$unique_name"; rspfile += ".rsp"; - out_ << " rspfile = " << rspfile << "\n"; + out_ << " rspfile = " << rspfile << std::endl; // Response file contents. out_ << " rspfile_content ="; @@ -169,7 +168,7 @@ SubstitutionWriter::WriteWithNinjaVariables(arg, args_escape_options, out_); } - out_ << "\n"; + out_ << std::endl; } // The command line requires shell escaping to properly handle filenames @@ -186,19 +185,19 @@ out_ << " "; SubstitutionWriter::WriteWithNinjaVariables(arg, args_escape_options, out_); } - out_ << "\n"; + out_ << std::endl; auto mnemonic = target_->action_values().mnemonic(); if (mnemonic.empty()) mnemonic = "ACTION"; - out_ << " description = " << mnemonic << " " << target_label << "\n"; - out_ << " restat = 1\n"; + out_ << " description = " << mnemonic << " " << target_label << std::endl; + out_ << " restat = 1" << std::endl; const Tool* tool = target_->toolchain()->GetTool(GeneralTool::kGeneralToolAction); if (tool && tool->pool().ptr) { out_ << " pool = "; out_ << tool->pool().ptr->GetNinjaName( settings_->default_toolchain_label()); - out_ << "\n"; + out_ << std::endl; } return custom_rule_name; @@ -236,11 +235,11 @@ out_ << " ||"; path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; // Response files require a unique name be defined. if (target_->action_values().uses_rsp_file()) - out_ << " unique_name = " << i << "\n"; + out_ << " unique_name = " << i << std::endl; // The required types is the union of the args and response file. This // might theoretically duplicate a definition if the same substitution is @@ -264,7 +263,7 @@ out_ << " pool = "; out_ << target_->pool().ptr->GetNinjaName( settings_->default_toolchain_label()); - out_ << "\n"; + out_ << std::endl; } } } @@ -290,14 +289,14 @@ out_, SubstitutionWriter::ApplyPatternToSourceAsOutputFile( target_, settings_, target_->action_values().depfile(), source)); - out_ << "\n"; + out_ << std::endl; // Using "deps = gcc" allows Ninja to read and store the depfile content in // its internal database which improves performance, especially for large // depfiles. The use of this feature with depfiles that contain multiple // outputs require Ninja version 1.9.0 or newer. if (settings_->build_settings()->ninja_required_version() >= Version{1, 9, 0}) { - out_ << " deps = gcc\n"; + out_ << " deps = gcc" << std::endl; } }
diff --git a/src/gn/ninja_action_target_writer.h b/src/gn/ninja_action_target_writer.h index fe18f5b..eff087b 100644 --- a/src/gn/ninja_action_target_writer.h +++ b/src/gn/ninja_action_target_writer.h
@@ -11,12 +11,11 @@ #include "gn/ninja_target_writer.h" class OutputFile; -class OutputStream; // Writes a .ninja file for a action target type. class NinjaActionTargetWriter : public NinjaTargetWriter { public: - NinjaActionTargetWriter(const Target* target, OutputStream& out); + NinjaActionTargetWriter(const Target* target, std::ostream& out); ~NinjaActionTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_action_target_writer_unittest.cc b/src/gn/ninja_action_target_writer_unittest.cc index 69035fb..9b7c76f 100644 --- a/src/gn/ninja_action_target_writer_unittest.cc +++ b/src/gn/ninja_action_target_writer_unittest.cc
@@ -3,10 +3,10 @@ // found in the LICENSE file. #include <algorithm> +#include <sstream> #include "gn/config.h" #include "gn/ninja_action_target_writer.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/substitution_list.h" #include "gn/target.h" @@ -27,7 +27,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); SourceFile source("//foo/bar.in"); @@ -57,7 +57,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -99,7 +99,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -141,7 +141,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -198,7 +198,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -269,7 +269,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -337,7 +337,7 @@ base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); setup.build_settings()->set_ninja_required_version(Version{1, 9, 0}); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -394,7 +394,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -452,7 +452,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/usr/bin/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run(); @@ -499,7 +499,7 @@ ASSERT_TRUE(foo.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&foo, out); writer.Run(); @@ -528,7 +528,7 @@ ASSERT_TRUE(bar.OnResolved(&err)) << err.message(); { - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&bar, out); writer.Run(); @@ -583,7 +583,7 @@ ASSERT_TRUE(foo.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&foo, out); writer.Run(); @@ -629,7 +629,7 @@ setup.build_settings()->set_python_path( base::FilePath(FILE_PATH_LITERAL("/Program Files/python"))); - StringOutputStream out; + std::ostringstream out; NinjaActionTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_binary_target_writer.cc b/src/gn/ninja_binary_target_writer.cc index 21b10fc..c244c7c 100644 --- a/src/gn/ninja_binary_target_writer.cc +++ b/src/gn/ninja_binary_target_writer.cc
@@ -4,6 +4,8 @@ #include "gn/ninja_binary_target_writer.h" +#include <sstream> + #include "base/strings/string_util.h" #include "gn/builtin_tool.h" #include "gn/config_values_extractors.h" @@ -14,7 +16,6 @@ #include "gn/ninja_rust_binary_target_writer.h" #include "gn/ninja_target_command_util.h" #include "gn/ninja_utils.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/settings.h" #include "gn/string_utils.h" @@ -34,7 +35,7 @@ } // namespace NinjaBinaryTargetWriter::NinjaBinaryTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out), rule_prefix_(GetNinjaRulePrefixForToolchain(settings_)) {} @@ -118,7 +119,7 @@ path_output_.WriteFile(out_, *input); } - out_ << "\n"; + out_ << std::endl; return {stamp_or_phony}; } @@ -291,22 +292,22 @@ out_ << " ||"; path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; if (!sources.empty() && can_write_source_info) { out_ << " " << "source_file_part = " << sources[0].GetName(); - out_ << "\n"; + out_ << std::endl; out_ << " " << "source_name_part = " << FindFilenameNoExtension(&sources[0].value()); - out_ << "\n"; + out_ << std::endl; } if (restat_output_allowed) { - out_ << " restat = 1\n"; + out_ << " restat = 1" << std::endl; } } -void NinjaBinaryTargetWriter::WriteCustomLinkerFlags(OutputStream& out, +void NinjaBinaryTargetWriter::WriteCustomLinkerFlags(std::ostream& out, const Tool* tool) { if (tool->AsC() || (tool->AsRust() && tool->AsRust()->MayLink())) { // First the ldflags from the target and its config. @@ -316,7 +317,7 @@ } } -void NinjaBinaryTargetWriter::WriteLibrarySearchPath(OutputStream& out, +void NinjaBinaryTargetWriter::WriteLibrarySearchPath(std::ostream& out, const Tool* tool) { // Write library search paths that have been recursively pushed // through the dependency tree. @@ -350,7 +351,7 @@ } void NinjaBinaryTargetWriter::WriteLinkerFlags( - OutputStream& out, + std::ostream& out, const Tool* tool, const SourceFile* optional_def_file) { // First any ldflags @@ -364,7 +365,7 @@ } } -void NinjaBinaryTargetWriter::WriteLibs(OutputStream& out, const Tool* tool) { +void NinjaBinaryTargetWriter::WriteLibs(std::ostream& out, const Tool* tool) { // Libraries that have been recursively pushed through the dependency tree. // Since we're passing these on the command line to the linker and not // to Ninja, we need to do shell escaping. @@ -387,7 +388,7 @@ } } -void NinjaBinaryTargetWriter::WriteFrameworks(OutputStream& out, +void NinjaBinaryTargetWriter::WriteFrameworks(std::ostream& out, const Tool* tool) { // Frameworks that have been recursively pushed through the dependency tree. FrameworksWriter writer(tool->framework_switch()); @@ -404,7 +405,7 @@ } void NinjaBinaryTargetWriter::WriteSwiftModules( - OutputStream& out, + std::ostream& out, const Tool* tool, const std::vector<OutputFile>& swiftmodules) { // Since we're passing these on the command line to the linker and not @@ -419,11 +420,11 @@ } } -void NinjaBinaryTargetWriter::WritePool(OutputStream& out) { +void NinjaBinaryTargetWriter::WritePool(std::ostream& out) { if (target_->pool().ptr) { out << " pool = "; out << target_->pool().ptr->GetNinjaName( settings_->default_toolchain_label()); - out << "\n"; + out << std::endl; } }
diff --git a/src/gn/ninja_binary_target_writer.h b/src/gn/ninja_binary_target_writer.h index 56a777a..29105b4 100644 --- a/src/gn/ninja_binary_target_writer.h +++ b/src/gn/ninja_binary_target_writer.h
@@ -11,15 +11,13 @@ #include "gn/toolchain.h" #include "gn/unique_vector.h" -class OutputStream; - struct EscapeOptions; // Writes a .ninja file for a binary target type (an executable, a shared // library, or a static library). class NinjaBinaryTargetWriter : public NinjaTargetWriter { public: - NinjaBinaryTargetWriter(const Target* target, OutputStream& out); + NinjaBinaryTargetWriter(const Target* target, std::ostream& out); ~NinjaBinaryTargetWriter() override; void Run() override; @@ -63,17 +61,17 @@ bool can_write_source_info = true, bool restat_output_allowed = false); - void WriteLinkerFlags(OutputStream& out, + void WriteLinkerFlags(std::ostream& out, const Tool* tool, const SourceFile* optional_def_file); - void WriteCustomLinkerFlags(OutputStream& out, const Tool* tool); - void WriteLibrarySearchPath(OutputStream& out, const Tool* tool); - void WriteLibs(OutputStream& out, const Tool* tool); - void WriteFrameworks(OutputStream& out, const Tool* tool); - void WriteSwiftModules(OutputStream& out, + void WriteCustomLinkerFlags(std::ostream& out, const Tool* tool); + void WriteLibrarySearchPath(std::ostream& out, const Tool* tool); + void WriteLibs(std::ostream& out, const Tool* tool); + void WriteFrameworks(std::ostream& out, const Tool* tool); + void WriteSwiftModules(std::ostream& out, const Tool* tool, const std::vector<OutputFile>& swiftmodules); - void WritePool(OutputStream& out); + void WritePool(std::ostream& out); void AddSourceSetFiles(const Target* source_set, UniqueVector<OutputFile>* obj_files) const;
diff --git a/src/gn/ninja_binary_target_writer_unittest.cc b/src/gn/ninja_binary_target_writer_unittest.cc index 7ef54c6..29dfd33 100644 --- a/src/gn/ninja_binary_target_writer_unittest.cc +++ b/src/gn/ninja_binary_target_writer_unittest.cc
@@ -4,7 +4,6 @@ #include "gn/ninja_binary_target_writer.h" -#include "gn/output_stream.h" #include "gn/test_with_scheduler.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -29,7 +28,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run(); @@ -66,7 +65,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run(); @@ -93,7 +92,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run(); @@ -129,7 +128,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run(); @@ -165,7 +164,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_build_writer.cc b/src/gn/ninja_build_writer.cc index de91eaf..5349948 100644 --- a/src/gn/ninja_build_writer.cc +++ b/src/gn/ninja_build_writer.cc
@@ -6,8 +6,10 @@ #include <stddef.h> +#include <fstream> #include <map> #include <set> +#include <sstream> #include "base/command_line.h" #include "base/files/file_util.h" @@ -21,7 +23,6 @@ #include "gn/input_file_manager.h" #include "gn/loader.h" #include "gn/ninja_utils.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/scheduler.h" #include "gn/string_atom.h" @@ -198,8 +199,8 @@ const std::vector<const Target*>& all_targets, const Toolchain* default_toolchain, const std::vector<const Target*>& default_toolchain_targets, - OutputStream& out, - OutputStream& dep_out) + std::ostream& out, + std::ostream& dep_out) : build_settings_(build_settings), used_toolchains_(used_toolchains), all_targets_(all_targets), @@ -253,8 +254,8 @@ } } - StringOutputStream file; - StringOutputStream depfile; + std::stringstream file; + std::stringstream depfile; NinjaBuildWriter gen(build_settings, used_toolchains, all_targets, default_toolchain, default_toolchain_targets, file, depfile); @@ -307,7 +308,7 @@ // static std::string NinjaBuildWriter::ExtractRegenerationCommands( std::istream& build_ninja_in) { - StringOutputStream out; + std::ostringstream out; int num_blank_lines = 0; for (std::string line; std::getline(build_ninja_in, line);) { out << line << '\n'; @@ -379,7 +380,7 @@ sorter.IterateOver(item_callback); - out_ << "\n"; + out_ << std::endl; } void NinjaBuildWriter::WriteAllPools() { @@ -414,9 +415,9 @@ std::string name = pool_name(pool); if (name == "console") continue; - out_ << "pool " << name << "\n" - << " depth = " << pool->depth() << "\n" - << "\n"; + out_ << "pool " << name << std::endl + << " depth = " << pool->depth() << std::endl + << std::endl; } } @@ -452,11 +453,11 @@ out_ << "subninja "; path_output_.WriteFile(out_, subninja); - out_ << "\n"; + out_ << std::endl; previous_subninja = subninja; previous_toolchain = pair.second; } - out_ << "\n"; + out_ << std::endl; return true; } @@ -674,22 +675,22 @@ } } } - out_ << "\n"; + out_ << std::endl; if (default_target) { // Use the short name when available if (written_rules.find(StringAtom("default")) != written_rules.end()) { - out_ << "\ndefault default\n"; + out_ << "\ndefault default" << std::endl; } else if (default_target->has_dependency_output()) { // If the default target does not have a dependency output file or phony, // then the target specified as default is a no-op. We omit the default // statement entirely to avoid ninja runtime failure. out_ << "\ndefault "; path_output_.WriteFile(out_, default_target->dependency_output()); - out_ << "\n"; + out_ << std::endl; } } else if (!default_toolchain_targets_.empty()) { - out_ << "\ndefault all\n"; + out_ << "\ndefault all" << std::endl; } return true; @@ -710,5 +711,5 @@ if (target->has_dependency_output()) { path_output_.WriteFile(out_, target->dependency_output()); } - out_ << "\n"; + out_ << std::endl; }
diff --git a/src/gn/ninja_build_writer.h b/src/gn/ninja_build_writer.h index 77d891c..c21769a 100644 --- a/src/gn/ninja_build_writer.h +++ b/src/gn/ninja_build_writer.h
@@ -35,8 +35,8 @@ const std::vector<const Target*>& all_targets, const Toolchain* default_toolchain, const std::vector<const Target*>& default_toolchain_targets, - OutputStream& out, - OutputStream& dep_out); + std::ostream& out, + std::ostream& dep_out); ~NinjaBuildWriter(); // The design of this class is that this static factory function takes the @@ -92,8 +92,8 @@ const Toolchain* default_toolchain_; const std::vector<const Target*>& default_toolchain_targets_; - OutputStream& out_; - OutputStream& dep_out_; + std::ostream& out_; + std::ostream& dep_out_; PathOutput path_output_; NinjaBuildWriter(const NinjaBuildWriter&) = delete;
diff --git a/src/gn/ninja_build_writer_unittest.cc b/src/gn/ninja_build_writer_unittest.cc index 5511147..493ba40 100644 --- a/src/gn/ninja_build_writer_unittest.cc +++ b/src/gn/ninja_build_writer_unittest.cc
@@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/ninja_build_writer.h" +#include <fstream> +#include <sstream> + #include "base/command_line.h" #include "base/files/file_util.h" -#include "gn/output_stream.h" +#include "gn/ninja_build_writer.h" #include "gn/pool.h" #include "gn/scheduler.h" #include "gn/switches.h" @@ -133,8 +135,8 @@ std::vector<const Target*> targets = {&target_foo, &target_bar, &target_baz}; - StringOutputStream ninja_out; - StringOutputStream depfile_out; + std::ostringstream ninja_out; + std::ostringstream depfile_out; NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets, setup.toolchain(), targets, ninja_out, depfile_out); @@ -209,8 +211,8 @@ std::vector<const Target*> targets = {&target_foo}; - StringOutputStream ninja_out; - StringOutputStream depfile_out; + std::stringstream ninja_out; + std::ostringstream depfile_out; NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets, setup.toolchain(), targets, ninja_out, depfile_out); @@ -239,9 +241,8 @@ EXPECT_SNIPPET(ninja_out_str, expected_root_target); EXPECT_SNIPPET(ninja_out_str, expected_default); - std::istringstream ninja_in(ninja_out.str()); std::string commands = - NinjaBuildWriter::ExtractRegenerationCommands(ninja_in); + NinjaBuildWriter::ExtractRegenerationCommands(ninja_out); EXPECT_SNIPPET(commands, expected_rule_gn); EXPECT_SNIPPET(commands, expected_build_ninja_stamp); EXPECT_SNIPPET(commands, expected_build_ninja); @@ -254,17 +255,18 @@ } TEST_F(NinjaBuildWriterTest, ExtractRegenerationCommands_DefaultStream) { - std::istringstream ninja_in; + std::ifstream ninja_in; EXPECT_EQ(NinjaBuildWriter::ExtractRegenerationCommands(ninja_in), ""); } TEST_F(NinjaBuildWriterTest, ExtractRegenerationCommands_StreamError) { - std::istringstream ninja_in("/does/not/exist"); + std::ifstream ninja_in("/does/not/exist"); EXPECT_EQ(NinjaBuildWriter::ExtractRegenerationCommands(ninja_in), ""); } TEST_F(NinjaBuildWriterTest, ExtractRegenerationCommands_IncompleteNinja) { - std::istringstream ninja_in("foo\nbar\nbaz\nbif\n"); + std::stringstream ninja_in; + ninja_in << "foo\nbar\nbaz\nbif\n"; EXPECT_EQ(NinjaBuildWriter::ExtractRegenerationCommands(ninja_in), ""); } @@ -285,8 +287,8 @@ std::unordered_map<const Settings*, const Toolchain*> used_toolchains; used_toolchains[setup.settings()] = setup.toolchain(); std::vector<const Target*> targets; - StringOutputStream ninja_out; - StringOutputStream depfile_out; + std::ostringstream ninja_out; + std::ostringstream depfile_out; NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets, setup.toolchain(), targets, ninja_out, depfile_out); ASSERT_TRUE(writer.Run(&err)); @@ -318,8 +320,8 @@ std::unordered_map<const Settings*, const Toolchain*> used_toolchains; used_toolchains[setup.settings()] = setup.toolchain(); std::vector<const Target*> targets = {&target_foo, &target_bar}; - StringOutputStream ninja_out; - StringOutputStream depfile_out; + std::ostringstream ninja_out; + std::ostringstream depfile_out; NinjaBuildWriter writer(setup.build_settings(), used_toolchains, targets, setup.toolchain(), targets, ninja_out, depfile_out); ASSERT_FALSE(writer.Run(&err));
diff --git a/src/gn/ninja_bundle_data_target_writer.cc b/src/gn/ninja_bundle_data_target_writer.cc index 362344d..4ba1733 100644 --- a/src/gn/ninja_bundle_data_target_writer.cc +++ b/src/gn/ninja_bundle_data_target_writer.cc
@@ -9,7 +9,7 @@ #include "gn/target.h" NinjaBundleDataTargetWriter::NinjaBundleDataTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} NinjaBundleDataTargetWriter::~NinjaBundleDataTargetWriter() = default;
diff --git a/src/gn/ninja_bundle_data_target_writer.h b/src/gn/ninja_bundle_data_target_writer.h index de1e3fc..720c593 100644 --- a/src/gn/ninja_bundle_data_target_writer.h +++ b/src/gn/ninja_bundle_data_target_writer.h
@@ -10,7 +10,7 @@ // Writes a .ninja file for a bundle_data target type. class NinjaBundleDataTargetWriter : public NinjaTargetWriter { public: - NinjaBundleDataTargetWriter(const Target* target, OutputStream& out); + NinjaBundleDataTargetWriter(const Target* target, std::ostream& out); ~NinjaBundleDataTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_bundle_data_target_writer_unittest.cc b/src/gn/ninja_bundle_data_target_writer_unittest.cc index 4de32bf..9f90245 100644 --- a/src/gn/ninja_bundle_data_target_writer_unittest.cc +++ b/src/gn/ninja_bundle_data_target_writer_unittest.cc
@@ -5,8 +5,8 @@ #include "gn/ninja_bundle_data_target_writer.h" #include <algorithm> +#include <sstream> -#include "gn/output_stream.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -41,7 +41,7 @@ bundle_data.visibility().SetPublic(); ASSERT_TRUE(bundle_data.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBundleDataTargetWriter writer(&bundle_data, out); writer.Run();
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc index 207741a..96907f7 100644 --- a/src/gn/ninja_c_binary_target_writer.cc +++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -9,6 +9,7 @@ #include <cstring> #include <set> +#include <sstream> #include "base/strings/string_util.h" #include "gn/c_substitution_type.h" @@ -20,7 +21,6 @@ #include "gn/general_tool.h" #include "gn/ninja_target_command_util.h" #include "gn/ninja_utils.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/scheduler.h" #include "gn/settings.h" @@ -122,7 +122,7 @@ } // namespace NinjaCBinaryTargetWriter::NinjaCBinaryTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaBinaryTargetWriter(target, out), tool_(target->toolchain()->GetToolForTargetFinalOutputAsC(target)) {} @@ -267,7 +267,7 @@ } } - out_ << "\n"; + out_ << std::endl; } } @@ -388,7 +388,7 @@ // Write two blank lines to help separate the PCH build lines from the // regular source build lines. - out_ << "\n\n"; + out_ << std::endl << std::endl; } void NinjaCBinaryTargetWriter::WriteWindowsPCHCommand( @@ -424,8 +424,7 @@ // Write two blank lines to help separate the PCH build lines from the // regular source build lines. - out_ << "\n" - << "\n"; + out_ << std::endl << std::endl; } void NinjaCBinaryTargetWriter::WriteSources( @@ -501,7 +500,7 @@ } } - out_ << "\n"; + out_ << std::endl; } void NinjaCBinaryTargetWriter::WriteSwiftSources( @@ -538,7 +537,7 @@ /*can_write_source_info=*/false, /*restat_output_allowed=*/true); - out_ << "\n"; + out_ << std::endl; } void NinjaCBinaryTargetWriter::WriteSourceSetStamp( @@ -694,7 +693,7 @@ WriteOrderOnlyDependencies(classified_deps.non_linkable_deps); // End of the link "build" line. - out_ << "\n"; + out_ << std::endl; // The remaining things go in the inner scope of the link line. if (target_->output_type() == Target::EXECUTABLE || @@ -702,22 +701,22 @@ target_->output_type() == Target::LOADABLE_MODULE) { out_ << " ldflags ="; WriteLinkerFlags(out_, tool_, optional_def_file); - out_ << "\n"; + out_ << std::endl; out_ << " libs ="; WriteLibs(out_, tool_); - out_ << "\n"; + out_ << std::endl; out_ << " frameworks ="; WriteFrameworks(out_, tool_); - out_ << "\n"; + out_ << std::endl; out_ << " swiftmodules ="; WriteSwiftModules(out_, tool_, swiftmodules); - out_ << "\n"; + out_ << std::endl; } else if (target_->output_type() == Target::STATIC_LIBRARY) { out_ << " arflags ="; RecursiveTargetConfigStringsToStream(kRecursiveWriterKeepDuplicates, target_, &ConfigValues::arflags, GetFlagOptions(), out_); - out_ << "\n"; + out_ << std::endl; } WriteOutputSubstitutions(); WriteLibsList("solibs", solibs); @@ -733,7 +732,7 @@ if (!output_extension.empty()) { out_ << " " << output_extension; } - out_ << "\n"; + out_ << std::endl; const std::string output_dir = SubstitutionWriter::GetLinkerSubstitution( target_, tool_, &SubstitutionOutputDir); @@ -741,7 +740,7 @@ if (!output_dir.empty()) { out_ << " " << output_dir; } - out_ << "\n"; + out_ << std::endl; } void NinjaCBinaryTargetWriter::WriteLibsList( @@ -755,7 +754,7 @@ settings_->build_settings()->root_path_utf8(), ESCAPE_NINJA_COMMAND); output.WriteFiles(out_, libs); - out_ << "\n"; + out_ << std::endl; } void NinjaCBinaryTargetWriter::WriteOrderOnlyDependencies(
diff --git a/src/gn/ninja_c_binary_target_writer.h b/src/gn/ninja_c_binary_target_writer.h index 6a553fc..f60790f 100644 --- a/src/gn/ninja_c_binary_target_writer.h +++ b/src/gn/ninja_c_binary_target_writer.h
@@ -10,8 +10,6 @@ #include "gn/toolchain.h" #include "gn/unique_vector.h" -class OutputStream; - struct EscapeOptions; struct ModuleDep; @@ -19,7 +17,7 @@ // library, or a static library). class NinjaCBinaryTargetWriter : public NinjaBinaryTargetWriter { public: - NinjaCBinaryTargetWriter(const Target* target, OutputStream& out); + NinjaCBinaryTargetWriter(const Target* target, std::ostream& out); ~NinjaCBinaryTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc index f8d1130..8d2a388 100644 --- a/src/gn/ninja_c_binary_target_writer_unittest.cc +++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -5,11 +5,11 @@ #include "gn/ninja_c_binary_target_writer.h" #include <memory> +#include <sstream> #include <utility> #include "gn/config.h" #include "gn/ninja_target_command_util.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/scheduler.h" #include "gn/target.h" @@ -40,7 +40,7 @@ // Source set itself. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -75,7 +75,7 @@ ASSERT_TRUE(shlib_target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&shlib_target, out); writer.Run(); @@ -112,7 +112,7 @@ ASSERT_TRUE(stlib_target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&stlib_target, out); writer.Run(); @@ -138,7 +138,7 @@ // Make the static library 'complete', which means it should be linked. stlib_target.set_complete_static_lib(true); { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&stlib_target, out); writer.Run(); @@ -175,7 +175,7 @@ target.config_values().defines().push_back("STR_DEF=\"ABCD-1\""); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -199,7 +199,7 @@ target.config_values().arflags().push_back("--asdf"); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -248,7 +248,7 @@ // should link in the dependent object files as if the dependent target // were a source set. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -280,7 +280,7 @@ // Dependent complete static libraries should not be linked directly. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -333,7 +333,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -401,7 +401,7 @@ gen_obj.SetToolchain(setup.toolchain()); ASSERT_TRUE(gen_obj.OnResolved(&err)); - StringOutputStream obj_out; + std::ostringstream obj_out; NinjaCBinaryTargetWriter obj_writer(&gen_obj, obj_out); obj_writer.Run(); @@ -440,7 +440,7 @@ gen_lib.SetToolchain(setup.toolchain()); ASSERT_TRUE(gen_lib.OnResolved(&err)); - StringOutputStream lib_out; + std::ostringstream lib_out; NinjaCBinaryTargetWriter lib_writer(&gen_lib, lib_out); lib_writer.Run(); @@ -479,7 +479,7 @@ executable.SetToolchain(setup.toolchain()); ASSERT_TRUE(executable.OnResolved(&err)) << err.message(); - StringOutputStream final_out; + std::ostringstream final_out; NinjaCBinaryTargetWriter final_writer(&executable, final_out); final_writer.Run(); @@ -527,7 +527,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -598,7 +598,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -642,7 +642,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -698,7 +698,7 @@ ASSERT_TRUE(inter.OnResolved(&err)) << err.message(); // Write out the intermediate target. - StringOutputStream inter_out; + std::ostringstream inter_out; NinjaCBinaryTargetWriter inter_writer(&inter, inter_out); inter_writer.Run(); @@ -732,7 +732,7 @@ exe.source_types_used().Set(SourceFile::SOURCE_CPP); ASSERT_TRUE(exe.OnResolved(&err)); - StringOutputStream final_out; + std::ostringstream final_out; NinjaCBinaryTargetWriter final_writer(&exe, final_out); final_writer.Run(); @@ -779,7 +779,7 @@ shared_lib.source_types_used().Set(SourceFile::SOURCE_DEF); ASSERT_TRUE(shared_lib.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&shared_lib, out); writer.Run(); @@ -819,7 +819,7 @@ loadable_module.source_types_used().Set(SourceFile::SOURCE_CPP); ASSERT_TRUE(loadable_module.OnResolved(&err)) << err.message(); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&loadable_module, out); writer.Run(); @@ -855,7 +855,7 @@ exe.source_types_used().Set(SourceFile::SOURCE_CPP); ASSERT_TRUE(exe.OnResolved(&err)) << err.message(); - StringOutputStream final_out; + std::ostringstream final_out; NinjaCBinaryTargetWriter final_writer(&exe, final_out); final_writer.Run(); @@ -937,7 +937,7 @@ no_pch_target.SetToolchain(&pch_toolchain); ASSERT_TRUE(no_pch_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&no_pch_target, out); writer.Run(); @@ -979,7 +979,7 @@ pch_target.SetToolchain(&pch_toolchain); ASSERT_TRUE(pch_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&pch_target, out); writer.Run(); @@ -1083,7 +1083,7 @@ no_pch_target.SetToolchain(&pch_toolchain); ASSERT_TRUE(no_pch_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&no_pch_target, out); writer.Run(); @@ -1125,7 +1125,7 @@ pch_target.SetToolchain(&pch_toolchain); ASSERT_TRUE(pch_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&pch_target, out); writer.Run(); @@ -1185,7 +1185,7 @@ scheduler().SuppressOutputForTesting(true); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1213,7 +1213,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1251,7 +1251,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1288,7 +1288,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1343,7 +1343,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1400,7 +1400,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1577,7 +1577,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1745,7 +1745,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1822,7 +1822,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1925,7 +1925,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2021,7 +2021,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2119,7 +2119,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2229,7 +2229,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2279,7 +2279,7 @@ target.source_types_used().Set(SourceFile::SOURCE_MODULEMAP); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2326,7 +2326,7 @@ ASSERT_TRUE(foo_target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&foo_target, out); writer.Run(); @@ -2364,7 +2364,7 @@ bar_target.SetToolchain(setup.toolchain()); ASSERT_TRUE(bar_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&bar_target, out); writer.Run(); @@ -2410,7 +2410,7 @@ bar_target.SetToolchain(setup.toolchain()); ASSERT_TRUE(bar_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&bar_target, out); writer.Run(); @@ -2445,7 +2445,7 @@ bar_target.SetToolchain(setup.toolchain()); ASSERT_TRUE(bar_target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&bar_target, out); writer.Run(); @@ -2544,7 +2544,7 @@ // The library first. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2589,7 +2589,7 @@ // A second library to make sure the depender includes both. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target2, out); writer.Run(); @@ -2633,7 +2633,7 @@ // A third library that depends on one of the previous static libraries, to // check module_deps_no_self. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target3, out); writer.Run(); @@ -2674,7 +2674,7 @@ // Then the executable that depends on it. { - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&depender, out); writer.Run(); @@ -2736,7 +2736,7 @@ target.SetToolchain(&toolchain_with_toc); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2786,7 +2786,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_copy_target_writer.cc b/src/gn/ninja_copy_target_writer.cc index 5be189b..47657c0 100644 --- a/src/gn/ninja_copy_target_writer.cc +++ b/src/gn/ninja_copy_target_writer.cc
@@ -8,7 +8,6 @@ #include "gn/general_tool.h" #include "gn/ninja_utils.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/scheduler.h" #include "gn/string_utils.h" #include "gn/substitution_list.h" @@ -17,7 +16,7 @@ #include "gn/toolchain.h" NinjaCopyTargetWriter::NinjaCopyTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} NinjaCopyTargetWriter::~NinjaCopyTargetWriter() = default; @@ -56,7 +55,7 @@ std::vector<OutputFile> output_files; WriteCopyRules(&output_files); - out_ << "\n"; + out_ << std::endl; WriteStampOrPhonyForTarget(output_files, std::vector<OutputFile>()); } @@ -125,6 +124,6 @@ path_output_.WriteFiles(out_, input_deps); path_output_.WriteFiles(out_, data_outs); } - out_ << "\n"; + out_ << std::endl; } }
diff --git a/src/gn/ninja_copy_target_writer.h b/src/gn/ninja_copy_target_writer.h index 0717fc8..95d50b4 100644 --- a/src/gn/ninja_copy_target_writer.h +++ b/src/gn/ninja_copy_target_writer.h
@@ -7,12 +7,10 @@ #include "gn/ninja_target_writer.h" -class OutputStream; - // Writes a .ninja file for a copy target type. class NinjaCopyTargetWriter : public NinjaTargetWriter { public: - NinjaCopyTargetWriter(const Target* target, OutputStream& out); + NinjaCopyTargetWriter(const Target* target, std::ostream& out); ~NinjaCopyTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_copy_target_writer_unittest.cc b/src/gn/ninja_copy_target_writer_unittest.cc index 3870ac3..1b5077a 100644 --- a/src/gn/ninja_copy_target_writer_unittest.cc +++ b/src/gn/ninja_copy_target_writer_unittest.cc
@@ -3,9 +3,9 @@ // found in the LICENSE file. #include <algorithm> +#include <sstream> #include "gn/ninja_copy_target_writer.h" -#include "gn/output_stream.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -27,7 +27,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCopyTargetWriter writer(&target, out); writer.Run(); @@ -56,7 +56,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCopyTargetWriter writer(&target, out); writer.Run(); @@ -81,7 +81,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCopyTargetWriter writer(&target, out); writer.Run(); @@ -113,7 +113,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCopyTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_create_bundle_target_writer.cc b/src/gn/ninja_create_bundle_target_writer.cc index 13fb1d8..09299c7 100644 --- a/src/gn/ninja_create_bundle_target_writer.cc +++ b/src/gn/ninja_create_bundle_target_writer.cc
@@ -12,7 +12,6 @@ #include "gn/general_tool.h" #include "gn/ninja_utils.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/scheduler.h" #include "gn/substitution_writer.h" #include "gn/target.h" @@ -69,7 +68,7 @@ NinjaCreateBundleTargetWriter::NinjaCreateBundleTargetWriter( const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} NinjaCreateBundleTargetWriter::~NinjaCreateBundleTargetWriter() = default; @@ -114,7 +113,7 @@ target_->bundle_data().GetBundleRootDirOutput(settings_))); out_ << ": " << BuiltinTool::kBuiltinToolPhony << " "; out_ << target_->dependency_output().value(); - out_ << "\n"; + out_ << std::endl; } std::string NinjaCreateBundleTargetWriter::WritePostProcessingRuleDefinition() { @@ -126,7 +125,7 @@ base::ReplaceChars(custom_rule_name, ":/()", "_", &custom_rule_name); custom_rule_name.append("_post_processing_rule"); - out_ << "rule " << custom_rule_name << "\n"; + out_ << "rule " << custom_rule_name << std::endl; out_ << " command = "; path_output_.WriteFile(out_, settings_->build_settings()->python_path()); out_ << " "; @@ -140,10 +139,10 @@ out_ << " "; SubstitutionWriter::WriteWithNinjaVariables(arg, args_escape_options, out_); } - out_ << "\n"; - out_ << " description = POST PROCESSING " << target_label << "\n"; - out_ << " restat = 1\n"; - out_ << "\n"; + out_ << std::endl; + out_ << " description = POST PROCESSING " << target_label << std::endl; + out_ << " restat = 1" << std::endl; + out_ << std::endl; return custom_rule_name; } @@ -184,7 +183,7 @@ path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; } } @@ -225,7 +224,7 @@ out_ << " ||"; path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; return; } @@ -262,14 +261,15 @@ path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; - out_ << " product_type = " << target_->bundle_data().product_type() << "\n"; + out_ << " product_type = " << target_->bundle_data().product_type() + << std::endl; if (partial_info_plist != OutputFile()) { out_ << " partial_info_plist = "; path_output_.WriteFile(out_, partial_info_plist); - out_ << "\n"; + out_ << std::endl; } const std::vector<SubstitutionPattern>& flags = @@ -283,7 +283,7 @@ SubstitutionWriter::WriteWithNinjaVariables(flag, args_escape_options, out_); } - out_ << "\n"; + out_ << std::endl; } } @@ -325,7 +325,7 @@ path_output_.WriteFile(out_, target->dependency_output()); } } - out_ << "\n"; + out_ << std::endl; return xcassets_input_stamp_or_phony; } @@ -355,7 +355,7 @@ out_ << ": " << post_processing_rule_name; out_ << " | "; path_output_.WriteFile(out_, post_processing_input_stamp_file); - out_ << "\n"; + out_ << std::endl; } OutputFile @@ -411,6 +411,6 @@ out_ << " ||"; path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; return stamp_or_phony; }
diff --git a/src/gn/ninja_create_bundle_target_writer.h b/src/gn/ninja_create_bundle_target_writer.h index ce68fa2..ee27557 100644 --- a/src/gn/ninja_create_bundle_target_writer.h +++ b/src/gn/ninja_create_bundle_target_writer.h
@@ -12,7 +12,7 @@ // Writes a .ninja file for a bundle_data target type. class NinjaCreateBundleTargetWriter : public NinjaTargetWriter { public: - NinjaCreateBundleTargetWriter(const Target* target, OutputStream& out); + NinjaCreateBundleTargetWriter(const Target* target, std::ostream& out); ~NinjaCreateBundleTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_create_bundle_target_writer_unittest.cc b/src/gn/ninja_create_bundle_target_writer_unittest.cc index 917f047..d79b719 100644 --- a/src/gn/ninja_create_bundle_target_writer_unittest.cc +++ b/src/gn/ninja_create_bundle_target_writer_unittest.cc
@@ -6,8 +6,8 @@ #include <algorithm> #include <memory> +#include <sstream> -#include "gn/output_stream.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -70,7 +70,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -119,7 +119,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -160,7 +160,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -224,7 +224,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -268,7 +268,7 @@ ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -388,7 +388,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -470,7 +470,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run(); @@ -553,7 +553,7 @@ create_bundle.SetToolchain(setup.toolchain()); ASSERT_TRUE(create_bundle.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaCreateBundleTargetWriter writer(&create_bundle, out); writer.Run();
diff --git a/src/gn/ninja_generated_file_target_writer.cc b/src/gn/ninja_generated_file_target_writer.cc index 81ac730..6de8207 100644 --- a/src/gn/ninja_generated_file_target_writer.cc +++ b/src/gn/ninja_generated_file_target_writer.cc
@@ -6,7 +6,6 @@ #include "gn/output_conversion.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/scheduler.h" #include "gn/settings.h" #include "gn/string_output_buffer.h" @@ -16,7 +15,7 @@ NinjaGeneratedFileTargetWriter::NinjaGeneratedFileTargetWriter( const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} NinjaGeneratedFileTargetWriter::~NinjaGeneratedFileTargetWriter() = default; @@ -90,8 +89,9 @@ // Compute output. StringOutputBuffer storage; - ConvertValueToOutput(settings_, contents, target_->output_conversion(), - storage, &err); + std::ostream out(&storage); + ConvertValueToOutput(settings_, contents, target_->output_conversion(), out, + &err); if (err.has_error()) { g_scheduler->FailWithError(err);
diff --git a/src/gn/ninja_generated_file_target_writer.h b/src/gn/ninja_generated_file_target_writer.h index 90e64d4..3103388 100644 --- a/src/gn/ninja_generated_file_target_writer.h +++ b/src/gn/ninja_generated_file_target_writer.h
@@ -10,7 +10,7 @@ // Writes a .ninja file for a group target type. class NinjaGeneratedFileTargetWriter : public NinjaTargetWriter { public: - NinjaGeneratedFileTargetWriter(const Target* target, OutputStream& out); + NinjaGeneratedFileTargetWriter(const Target* target, std::ostream& out); ~NinjaGeneratedFileTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_generated_file_target_writer_unittest.cc b/src/gn/ninja_generated_file_target_writer_unittest.cc index 119f4ea..481db80 100644 --- a/src/gn/ninja_generated_file_target_writer_unittest.cc +++ b/src/gn/ninja_generated_file_target_writer_unittest.cc
@@ -4,7 +4,6 @@ #include "gn/ninja_generated_file_target_writer.h" -#include "gn/output_stream.h" #include "gn/source_file.h" #include "gn/target.h" #include "gn/test_with_scheduler.h" @@ -59,7 +58,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)) << err.message(); - StringOutputStream out; + std::ostringstream out; NinjaGeneratedFileTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_group_target_writer.cc b/src/gn/ninja_group_target_writer.cc index 3dde553..7db1a3a 100644 --- a/src/gn/ninja_group_target_writer.cc +++ b/src/gn/ninja_group_target_writer.cc
@@ -11,7 +11,7 @@ #include "gn/target.h" NinjaGroupTargetWriter::NinjaGroupTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} NinjaGroupTargetWriter::~NinjaGroupTargetWriter() = default;
diff --git a/src/gn/ninja_group_target_writer.h b/src/gn/ninja_group_target_writer.h index b286bce..7a3f211 100644 --- a/src/gn/ninja_group_target_writer.h +++ b/src/gn/ninja_group_target_writer.h
@@ -10,7 +10,7 @@ // Writes a .ninja file for a group target type. class NinjaGroupTargetWriter : public NinjaTargetWriter { public: - NinjaGroupTargetWriter(const Target* target, OutputStream& out); + NinjaGroupTargetWriter(const Target* target, std::ostream& out); ~NinjaGroupTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_group_target_writer_unittest.cc b/src/gn/ninja_group_target_writer_unittest.cc index e61b2f8..ec9f72d 100644 --- a/src/gn/ninja_group_target_writer_unittest.cc +++ b/src/gn/ninja_group_target_writer_unittest.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "gn/ninja_group_target_writer.h" -#include "gn/output_stream.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -50,7 +49,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaGroupTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_rust_binary_target_writer.cc b/src/gn/ninja_rust_binary_target_writer.cc index e4aafe8..ba6b416 100644 --- a/src/gn/ninja_rust_binary_target_writer.cc +++ b/src/gn/ninja_rust_binary_target_writer.cc
@@ -4,6 +4,8 @@ #include "gn/ninja_rust_binary_target_writer.h" +#include <sstream> + #include "base/strings/string_util.h" #include "gn/deps_iterator.h" #include "gn/filesystem_utils.h" @@ -27,16 +29,16 @@ void WriteVar(const char* name, const std::string& value, EscapeOptions opts, - OutputStream& out) { + std::ostream& out) { out << name << " = "; EscapeStringToStream(out, value, opts); - out << "\n"; + out << std::endl; } void WriteCrateVars(const Target* target, const Tool* tool, EscapeOptions opts, - OutputStream& out) { + std::ostream& out) { WriteVar(kRustSubstitutionCrateName.ninja_name, target->rust_values().crate_name(), opts, out); @@ -98,7 +100,7 @@ } // namespace NinjaRustBinaryTargetWriter::NinjaRustBinaryTargetWriter(const Target* target, - OutputStream& out) + std::ostream& out) : NinjaBinaryTargetWriter(target, out), tool_(target->toolchain()->GetToolForTargetFinalOutputAsRust(target)) {} @@ -263,7 +265,7 @@ out_ << " "; path_output_.WriteFile(out_, OutputFile(settings_->build_settings(), data)); } - out_ << "\n"; + out_ << std::endl; } void NinjaRustBinaryTargetWriter::WriteExternsAndDeps( @@ -351,7 +353,7 @@ } } - out_ << "\n"; + out_ << std::endl; out_ << " rustdeps ="; for (const SourceDir& dir : private_extern_dirs) { @@ -383,11 +385,11 @@ WriteFrameworks(out_, tool_); WriteSwiftModules(out_, tool_, swiftmodules); - out_ << "\n"; + out_ << std::endl; out_ << " ldflags ="; // If rustc will invoke a linker, linker flags need to be forwarded through to // the linker. WriteCustomLinkerFlags(out_, tool_); - out_ << "\n"; + out_ << std::endl; }
diff --git a/src/gn/ninja_rust_binary_target_writer.h b/src/gn/ninja_rust_binary_target_writer.h index 7966fc7..83e1203 100644 --- a/src/gn/ninja_rust_binary_target_writer.h +++ b/src/gn/ninja_rust_binary_target_writer.h
@@ -14,7 +14,7 @@ // library, or a static library). class NinjaRustBinaryTargetWriter : public NinjaBinaryTargetWriter { public: - NinjaRustBinaryTargetWriter(const Target* target, OutputStream& out); + NinjaRustBinaryTargetWriter(const Target* target, std::ostream& out); ~NinjaRustBinaryTargetWriter() override; void Run() override;
diff --git a/src/gn/ninja_rust_binary_target_writer_unittest.cc b/src/gn/ninja_rust_binary_target_writer_unittest.cc index 2497ac6..461cbd8 100644 --- a/src/gn/ninja_rust_binary_target_writer_unittest.cc +++ b/src/gn/ninja_rust_binary_target_writer_unittest.cc
@@ -6,7 +6,6 @@ #include "gn/config.h" #include "gn/label_ptr.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/rust_values.h" #include "gn/scheduler.h" @@ -50,7 +49,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -105,7 +104,7 @@ ASSERT_TRUE(private_rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&private_rlib, out); writer.Run(); @@ -147,7 +146,7 @@ ASSERT_TRUE(far_public_rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&far_public_rlib, out); writer.Run(); @@ -189,7 +188,7 @@ ASSERT_TRUE(public_rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&public_rlib, out); writer.Run(); @@ -245,7 +244,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -298,7 +297,7 @@ ASSERT_TRUE(private_inside_dylib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&private_inside_dylib, out); writer.Run(); @@ -339,7 +338,7 @@ ASSERT_TRUE(inside_dylib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&inside_dylib, out); writer.Run(); @@ -383,7 +382,7 @@ ASSERT_TRUE(dylib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&dylib, out); writer.Run(); @@ -456,7 +455,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -508,7 +507,7 @@ ASSERT_TRUE(procmacro.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&procmacro, out); writer.Run(); @@ -564,7 +563,7 @@ ASSERT_TRUE(rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&rlib, out); writer.Run(); @@ -611,7 +610,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -703,7 +702,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -806,7 +805,7 @@ ASSERT_TRUE(nonrust.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&nonrust, out); writer.Run(); @@ -853,7 +852,7 @@ ASSERT_TRUE(nonrust_only.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&nonrust_only, out); writer.Run(); @@ -894,7 +893,7 @@ ASSERT_TRUE(rstaticlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&rstaticlib, out); writer.Run(); @@ -1066,7 +1065,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1132,7 +1131,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1199,7 +1198,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1299,7 +1298,7 @@ ASSERT_TRUE(rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&rlib, out); writer.Run(); @@ -1383,7 +1382,7 @@ ASSERT_TRUE(procmacro.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&procmacro, out); writer.Run(); @@ -1430,7 +1429,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1476,7 +1475,7 @@ ASSERT_TRUE(rlib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&rlib, out); writer.Run(); @@ -1525,7 +1524,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1580,7 +1579,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1629,7 +1628,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1677,7 +1676,7 @@ cdylib.SetToolchain(setup.toolchain()); ASSERT_TRUE(cdylib.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&cdylib, out); writer.Run(); const char expected[] = @@ -1717,7 +1716,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1794,7 +1793,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1879,7 +1878,7 @@ ASSERT_TRUE(target.OnResolved(&err)); { - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -1933,7 +1932,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2006,7 +2005,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run(); @@ -2064,7 +2063,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream out; + std::ostringstream out; NinjaRustBinaryTargetWriter writer(&target, out); writer.Run();
diff --git a/src/gn/ninja_target_command_util.cc b/src/gn/ninja_target_command_util.cc index 4b78677..a691ae3 100644 --- a/src/gn/ninja_target_command_util.cc +++ b/src/gn/ninja_target_command_util.cc
@@ -50,7 +50,7 @@ const, EscapeOptions flag_escape_options, PathOutput& path_output, - OutputStream& out, + std::ostream& out, bool write_substitution, bool indent) { if (!target->toolchain()->substitution_bits().used.count(subst_enum)) @@ -103,7 +103,7 @@ } if (write_substitution) - out << "\n"; + out << std::endl; } void GetPCHOutputFiles(const Target* target,
diff --git a/src/gn/ninja_target_command_util.h b/src/gn/ninja_target_command_util.h index e754ef7..93666fb 100644 --- a/src/gn/ninja_target_command_util.h +++ b/src/gn/ninja_target_command_util.h
@@ -12,7 +12,6 @@ #include "gn/escape.h" #include "gn/filesystem_utils.h" #include "gn/frameworks_utils.h" -#include "gn/output_stream.h" #include "gn/path_output.h" #include "gn/target.h" #include "gn/toolchain.h" @@ -22,7 +21,7 @@ DefineWriter() { options.mode = ESCAPE_NINJA_COMMAND; } DefineWriter(EscapingMode mode) { options.mode = mode; } - void operator()(const std::string& s, OutputStream& out) const { + void operator()(const std::string& s, std::ostream& out) const { out << " "; EscapeStringToStream(out, "-D" + s, options); } @@ -36,8 +35,8 @@ ~FrameworkDirsWriter() = default; - void operator()(const SourceDir& d, OutputStream& out) const { - StringOutputStream path_out; + void operator()(const SourceDir& d, std::ostream& out) const { + std::ostringstream path_out; path_output_.WriteDir(path_out, d, PathOutput::DIR_NO_LAST_SLASH); const std::string& path = path_out.str(); if (path[0] == '"') @@ -58,7 +57,7 @@ options_.mode = mode; } - void operator()(const std::string& s, OutputStream& out) const { + void operator()(const std::string& s, std::ostream& out) const { out << " " << tool_switch_; std::string_view framework_name = GetFrameworkName(s); EscapeStringToStream(out, framework_name, options_); @@ -72,8 +71,8 @@ explicit IncludeWriter(PathOutput& path_output) : path_output_(path_output) {} ~IncludeWriter() = default; - void operator()(const SourceDir& d, OutputStream& out) const { - StringOutputStream path_out; + void operator()(const SourceDir& d, std::ostream& out) const { + std::ostringstream path_out; path_output_.WriteDir(path_out, d, PathOutput::DIR_NO_LAST_SLASH); const std::string& path = path_out.str(); if (path[0] == '"') @@ -102,7 +101,7 @@ const, EscapeOptions flag_escape_options, PathOutput& path_output, - OutputStream& out, + std::ostream& out, bool write_substitution = true, bool indent = false);
diff --git a/src/gn/ninja_target_command_util_unittest.cc b/src/gn/ninja_target_command_util_unittest.cc index 6b2a9f2..8da62d3 100644 --- a/src/gn/ninja_target_command_util_unittest.cc +++ b/src/gn/ninja_target_command_util_unittest.cc
@@ -5,8 +5,8 @@ #include "gn/ninja_target_command_util.h" #include <algorithm> +#include <sstream> -#include "gn/output_stream.h" #include "util/build_config.h" #include "util/test/test.h" @@ -16,7 +16,7 @@ // the generated output as a string. template <typename Writer, typename Item> std::string FormatWithWriter(Writer writer, std::vector<Item> items) { - StringOutputStream out; + std::ostringstream out; for (const Item& item : items) { writer(item, out); } @@ -36,7 +36,7 @@ // see the difference in the error message (by default the error message // would just be "formatted == expected"). if (formatted != expected) { - StringOutputStream stream; + std::ostringstream stream; stream << '"' << expected << "\" == \"" << formatted << '"'; std::string message = stream.str();
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc index 163840f..01a1407 100644 --- a/src/gn/ninja_target_writer.cc +++ b/src/gn/ninja_target_writer.cc
@@ -4,6 +4,8 @@ #include "gn/ninja_target_writer.h" +#include <sstream> + #include "base/files/file_util.h" #include "base/strings/string_util.h" #include "gn/builtin_tool.h" @@ -23,7 +25,6 @@ #include "gn/ninja_target_command_util.h" #include "gn/ninja_utils.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/rust_substitution_type.h" #include "gn/scheduler.h" #include "gn/string_output_buffer.h" @@ -32,7 +33,7 @@ #include "gn/target.h" #include "gn/trace.h" -NinjaTargetWriter::NinjaTargetWriter(const Target* target, OutputStream& out) +NinjaTargetWriter::NinjaTargetWriter(const Target* target, std::ostream& out) : settings_(target->settings()), target_(target), out_(out), @@ -110,7 +111,8 @@ // It's ridiculously faster to write to a string and then write that to // disk in one operation than to use an fstream here. - StringOutputBuffer rules; + StringOutputBuffer storage; + std::ostream rules(&storage); // Call out to the correct sub-type of writer. Binary targets need to be // written to separate files for compiler flag scoping, but other target @@ -174,7 +176,7 @@ SourceFile ninja_file = GetNinjaFileForTarget(target); base::FilePath full_ninja_file = settings->build_settings()->GetFullPath(ninja_file); - rules.WriteToFileIfChanged(full_ninja_file, nullptr); + storage.WriteToFileIfChanged(full_ninja_file, nullptr); EscapeOptions options; options.mode = ESCAPE_NINJA; @@ -189,7 +191,7 @@ } // No separate file required, just return the rules. - return rules.str(); + return storage.str(); } void NinjaTargetWriter::WriteEscapedSubstitution(const Substitution* type) { @@ -199,7 +201,7 @@ out_ << type->ninja_name << " = "; EscapeStringToStream( out_, SubstitutionWriter::GetTargetSubstitution(target_, type), opts); - out_ << "\n"; + out_ << std::endl; } void NinjaTargetWriter::WriteSharedVars(const SubstitutionBits& bits) { @@ -256,7 +258,7 @@ // If we wrote any vars, separate them from the rest of the file that follows // with a blank line. if (written_anything) - out_ << "\n"; + out_ << std::endl; } void NinjaTargetWriter::WriteCCompilerVars(const SubstitutionBits& bits, @@ -270,7 +272,7 @@ RecursiveTargetConfigToStream<std::string>(kRecursiveWriterSkipDuplicates, target_, &ConfigValues::defines, DefineWriter(), out_); - out_ << "\n"; + out_ << std::endl; } // Framework search path. @@ -288,7 +290,7 @@ FrameworkDirsWriter(framework_dirs_output, tool->framework_dir_switch()), out_); - out_ << "\n"; + out_ << std::endl; } // Include directories. @@ -302,7 +304,7 @@ RecursiveTargetConfigToStream<SourceDir>( kRecursiveWriterSkipDuplicates, target_, &ConfigValues::include_dirs, IncludeWriter(include_path_output), out_); - out_ << "\n"; + out_ << std::endl; } bool has_precompiled_headers = @@ -368,7 +370,7 @@ out_ << " "; out_ << CSubstitutionSwiftModuleName.ninja_name << " = "; EscapeStringToStream(out_, target_->swift_values().module_name(), opts); - out_ << "\n"; + out_ << std::endl; } if (bits.used.count(&CSubstitutionSwiftBridgeHeader)) { @@ -380,7 +382,7 @@ } else { out_ << R"("")"; } - out_ << "\n"; + out_ << std::endl; } if (bits.used.count(&CSubstitutionSwiftModuleDirs)) { @@ -400,7 +402,7 @@ for (const SourceDir& swiftmodule_dir : swiftmodule_dirs) { swiftmodule_path_writer(swiftmodule_dir, out_); } - out_ << "\n"; + out_ << std::endl; } WriteOneFlag(kRecursiveWriterKeepDuplicates, target_, @@ -619,5 +621,5 @@ out_ << " ||"; path_output_.WriteFiles(out_, order_only_deps); } - out_ << "\n"; + out_ << std::endl; }
diff --git a/src/gn/ninja_target_writer.h b/src/gn/ninja_target_writer.h index 4ae2515..68bc0a3 100644 --- a/src/gn/ninja_target_writer.h +++ b/src/gn/ninja_target_writer.h
@@ -12,7 +12,6 @@ #include "gn/substitution_type.h" class OutputFile; -class OutputStream; class Settings; class Target; struct SubstitutionBits; @@ -21,7 +20,7 @@ // generated by the NinjaBuildWriter. class NinjaTargetWriter { public: - NinjaTargetWriter(const Target* target, OutputStream& out); + NinjaTargetWriter(const Target* target, std::ostream& out); virtual ~NinjaTargetWriter(); // Returns a ResolvedTargetData that can be used to retrieve information @@ -102,7 +101,7 @@ const Settings* settings_; // Non-owning. const Target* target_; // Non-owning. - OutputStream& out_; + std::ostream& out_; PathOutput path_output_; // Write a Ninja output file to out_, and also add it to |*ninja_outputs_|
diff --git a/src/gn/ninja_target_writer_unittest.cc b/src/gn/ninja_target_writer_unittest.cc index d2472a9..ae691d7 100644 --- a/src/gn/ninja_target_writer_unittest.cc +++ b/src/gn/ninja_target_writer_unittest.cc
@@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/ninja_target_writer.h" +#include <sstream> + #include "gn/ninja_action_target_writer.h" -#include "gn/output_stream.h" +#include "gn/ninja_target_writer.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/test/test.h" @@ -15,7 +16,7 @@ public: TestingNinjaTargetWriter(const Target* target, const Toolchain* toolchain, - OutputStream& out) + std::ostream& out) : NinjaTargetWriter(target, out) {} void Run() override {} @@ -43,7 +44,7 @@ base_target.action_values().set_script(SourceFile("//foo/script.py")); ASSERT_TRUE(base_target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&base_target, setup.toolchain(), stream); const auto* resolved_ptr = &writer.resolved(); @@ -66,7 +67,7 @@ ASSERT_TRUE(base_target.OnResolved(&err)); ResolvedTargetData resolved; - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&base_target, setup.toolchain(), stream); writer.SetResolvedTargetData(&resolved); @@ -110,7 +111,7 @@ // Input deps for the base (should be only the script itself). { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&base_target, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -124,7 +125,7 @@ // Input deps for the target (should depend on the base). { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&target, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -136,7 +137,7 @@ } { - StringOutputStream stream; + std::ostringstream stream; NinjaActionTargetWriter writer(&action, stream); writer.Run(); EXPECT_EQ( @@ -155,7 +156,7 @@ // Input deps for action which should depend on the base since its a hard dep // that is a (indirect) dependency, as well as the the action source. { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&action, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -207,7 +208,7 @@ // Input deps for the base (should be only the script itself). { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&base_target, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -221,7 +222,7 @@ // Input deps for the target (should depend on the base). { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&target, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -233,7 +234,7 @@ } { - StringOutputStream stream; + std::ostringstream stream; NinjaActionTargetWriter writer(&action, stream); writer.Run(); EXPECT_EQ( @@ -252,7 +253,7 @@ // Input deps for action which should depend on the base since its a hard dep // that is a (indirect) dependency, as well as the the action source. { - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&action, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u); @@ -288,7 +289,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; TestingNinjaTargetWriter writer(&target, setup.toolchain(), stream); std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep( std::vector<const Target*>(), 10u);
diff --git a/src/gn/ninja_toolchain_writer.cc b/src/gn/ninja_toolchain_writer.cc index 4d68eeb..917d068 100644 --- a/src/gn/ninja_toolchain_writer.cc +++ b/src/gn/ninja_toolchain_writer.cc
@@ -4,6 +4,8 @@ #include "gn/ninja_toolchain_writer.h" +#include <fstream> + #include "base/files/file_util.h" #include "base/strings/stringize_macros.h" #include "gn/build_settings.h" @@ -12,7 +14,6 @@ #include "gn/filesystem_utils.h" #include "gn/general_tool.h" #include "gn/ninja_utils.h" -#include "gn/output_stream.h" #include "gn/pool.h" #include "gn/settings.h" #include "gn/substitution_writer.h" @@ -28,7 +29,7 @@ NinjaToolchainWriter::NinjaToolchainWriter(const Settings* settings, const Toolchain* toolchain, - OutputStream& out) + std::ostream& out) : settings_(settings), toolchain_(toolchain), out_(out), @@ -49,7 +50,7 @@ } WriteToolRule(tool.second.get(), rule_prefix); } - out_ << "\n"; + out_ << std::endl; for (const auto& pair : rules) out_ << pair.second; @@ -67,7 +68,9 @@ base::CreateDirectory(ninja_file.DirName()); - FileOutputStream file(FilePathToUTF8(ninja_file).c_str()); + std::ofstream file; + file.open(FilePathToUTF8(ninja_file).c_str(), + std::ios_base::out | std::ios_base::binary); if (file.fail()) return false; @@ -78,7 +81,7 @@ void NinjaToolchainWriter::WriteToolRule(Tool* tool, const std::string& rule_prefix) { - out_ << "rule " << rule_prefix << tool->name() << "\n"; + out_ << "rule " << rule_prefix << tool->name() << std::endl; // Rules explicitly include shell commands, so don't try to escape. EscapeOptions options; @@ -96,26 +99,26 @@ // GCC-style deps require a depfile. if (!c_tool->depfile().empty()) { WriteRulePattern("depfile", tool->depfile(), options); - out_ << kIndent << "deps = gcc\n"; + out_ << kIndent << "deps = gcc" << std::endl; } } else if (c_tool->depsformat() == CTool::DEPS_MSVC) { // MSVC deps don't have a depfile. - out_ << kIndent << "deps = msvc\n"; + out_ << kIndent << "deps = msvc" << std::endl; } } else if (!tool->depfile().empty()) { WriteRulePattern("depfile", tool->depfile(), options); - out_ << kIndent << "deps = gcc\n"; + out_ << kIndent << "deps = gcc" << std::endl; } // Use pool is specified. if (tool->pool().ptr) { std::string pool_name = tool->pool().ptr->GetNinjaName(settings_->default_toolchain_label()); - out_ << kIndent << "pool = " << pool_name << "\n"; + out_ << kIndent << "pool = " << pool_name << std::endl; } if (tool->restat()) - out_ << kIndent << "restat = 1\n"; + out_ << kIndent << "restat = 1" << std::endl; } void NinjaToolchainWriter::WriteRulePattern(const char* name, @@ -125,7 +128,7 @@ return; out_ << kIndent << name << " = "; SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out_); - out_ << "\n"; + out_ << std::endl; } void NinjaToolchainWriter::WriteCommandRulePattern( @@ -138,5 +141,5 @@ if (!launcher.empty()) out_ << launcher << " "; SubstitutionWriter::WriteWithNinjaVariables(command, options, out_); - out_ << "\n"; + out_ << std::endl; }
diff --git a/src/gn/ninja_toolchain_writer.h b/src/gn/ninja_toolchain_writer.h index b7fd2ee..cbc7c68 100644 --- a/src/gn/ninja_toolchain_writer.h +++ b/src/gn/ninja_toolchain_writer.h
@@ -34,7 +34,7 @@ NinjaToolchainWriter(const Settings* settings, const Toolchain* toolchain, - OutputStream& out); + std::ostream& out); ~NinjaToolchainWriter(); void Run(const std::vector<NinjaWriter::TargetRulePair>& extra_rules); @@ -51,7 +51,7 @@ const Settings* settings_; const Toolchain* toolchain_; - OutputStream& out_; + std::ostream& out_; PathOutput path_output_; NinjaToolchainWriter(const NinjaToolchainWriter&) = delete;
diff --git a/src/gn/ninja_toolchain_writer_unittest.cc b/src/gn/ninja_toolchain_writer_unittest.cc index 56f22db..863c174 100644 --- a/src/gn/ninja_toolchain_writer_unittest.cc +++ b/src/gn/ninja_toolchain_writer_unittest.cc
@@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <sstream> + #include "gn/ninja_toolchain_writer.h" -#include "gn/output_stream.h" #include "gn/test_with_scope.h" #include "util/test/test.h" TEST(NinjaToolchainWriter, WriteToolRule) { TestWithScope setup; - StringOutputStream stream; + std::ostringstream stream; NinjaToolchainWriter writer(setup.settings(), setup.toolchain(), stream); writer.WriteToolRule(setup.toolchain()->GetTool(CTool::kCToolCc), std::string("prefix_")); @@ -25,7 +26,7 @@ TEST(NinjaToolchainWriter, WriteToolRuleWithLauncher) { TestWithScope setup; - StringOutputStream stream; + std::ostringstream stream; NinjaToolchainWriter writer(setup.settings(), setup.toolchain(), stream); writer.WriteToolRule(setup.toolchain()->GetTool(CTool::kCToolCxx), std::string("prefix_"));
diff --git a/src/gn/output_conversion.cc b/src/gn/output_conversion.cc index 10b397c..971e740 100644 --- a/src/gn/output_conversion.cc +++ b/src/gn/output_conversion.cc
@@ -4,29 +4,28 @@ #include "gn/output_conversion.h" -#include "gn/output_stream.h" #include "gn/settings.h" #include "gn/value.h" namespace { -void ToString(const Value& output, OutputStream& out) { +void ToString(const Value& output, std::ostream& out) { out << output.ToString(false); } -void ToStringQuoted(const Value& output, OutputStream& out) { +void ToStringQuoted(const Value& output, std::ostream& out) { out << "\"" << output.ToString(false) << "\""; } -void Indent(int indent, OutputStream& out) { +void Indent(int indent, std::ostream& out) { for (int i = 0; i < indent; ++i) out << " "; } // Forward declare so it can be used recursively. -void RenderScopeToJSON(const Value& output, OutputStream& out, int indent); +void RenderScopeToJSON(const Value& output, std::ostream& out, int indent); -void RenderListToJSON(const Value& output, OutputStream& out, int indent) { +void RenderListToJSON(const Value& output, std::ostream& out, int indent) { assert(indent > 0); bool first = true; out << "[\n"; @@ -47,7 +46,7 @@ out << "]"; } -void RenderScopeToJSON(const Value& output, OutputStream& out, int indent) { +void RenderScopeToJSON(const Value& output, std::ostream& out, int indent) { assert(indent > 0); Scope::KeyValueMap scope_values; output.scope_value()->GetCurrentScopeValues(&scope_values); @@ -71,14 +70,14 @@ out << "}"; } -void OutputListLines(const Value& output, OutputStream& out) { +void OutputListLines(const Value& output, std::ostream& out) { assert(output.type() == Value::LIST); const std::vector<Value>& list = output.list_value(); for (const auto& cur : list) out << cur.ToString(false) << "\n"; } -void OutputString(const Value& output, OutputStream& out) { +void OutputString(const Value& output, std::ostream& out) { if (output.type() == Value::NONE) return; if (output.type() == Value::STRING) { @@ -88,7 +87,7 @@ ToStringQuoted(output, out); } -void OutputValue(const Value& output, OutputStream& out) { +void OutputValue(const Value& output, std::ostream& out) { if (output.type() == Value::NONE) return; if (output.type() == Value::STRING) { @@ -100,7 +99,7 @@ // The direct Value::ToString call wraps the scope in '{}', which we don't want // here for the top-level scope being output. -void OutputScope(const Value& output, OutputStream& out) { +void OutputScope(const Value& output, std::ostream& out) { Scope::KeyValueMap scope_values; output.scope_value()->GetCurrentScopeValues(&scope_values); for (const auto& pair : scope_values) { @@ -108,14 +107,14 @@ } } -void OutputDefault(const Value& output, OutputStream& out) { +void OutputDefault(const Value& output, std::ostream& out) { if (output.type() == Value::LIST) OutputListLines(output, out); else ToString(output, out); } -void OutputJSON(const Value& output, OutputStream& out) { +void OutputJSON(const Value& output, std::ostream& out) { if (output.type() == Value::SCOPE) { RenderScopeToJSON(output, out, /*indent=*/1); return; @@ -130,7 +129,7 @@ void DoConvertValueToOutput(const Value& output, const std::string& output_conversion, const Value& original_output_conversion, - OutputStream& out, + std::ostream& out, Err* err) { if (output_conversion == "") { OutputDefault(output, out); @@ -164,7 +163,7 @@ void ConvertValueToOutput(const Settings* settings, const Value& output, const Value& output_conversion, - OutputStream& out, + std::ostream& out, Err* err) { if (output_conversion.type() == Value::NONE) { OutputDefault(output, out);
diff --git a/src/gn/output_conversion.h b/src/gn/output_conversion.h index 3e72fe1..09ca254 100644 --- a/src/gn/output_conversion.h +++ b/src/gn/output_conversion.h
@@ -9,7 +9,6 @@ #include <string> class Err; -class OutputStream; class Settings; class Value; @@ -21,7 +20,7 @@ void ConvertValueToOutput(const Settings* settings, const Value& output, const Value& output_conversion_value, - OutputStream& out, + std::ostream& out, Err* err); #endif // TOOLS_GN_OUTPUT_CONVERSION_H_
diff --git a/src/gn/output_conversion_unittest.cc b/src/gn/output_conversion_unittest.cc index 44fc1da..43fdad5 100644 --- a/src/gn/output_conversion_unittest.cc +++ b/src/gn/output_conversion_unittest.cc
@@ -4,9 +4,10 @@ #include "gn/output_conversion.h" +#include <sstream> + #include "gn/err.h" #include "gn/input_conversion.h" -#include "gn/output_stream.h" #include "gn/scope.h" #include "gn/template.h" #include "gn/test_with_scheduler.h" @@ -37,7 +38,7 @@ output.list_value().push_back(Value(nullptr, "foo")); output.list_value().push_back(Value(nullptr, "")); output.list_value().push_back(Value(nullptr, "bar")); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "list lines"), result, &err); @@ -48,7 +49,7 @@ TEST_F(OutputConversionTest, String) { Err err; Value output(nullptr, "foo bar"); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, &err); @@ -59,7 +60,7 @@ TEST_F(OutputConversionTest, StringInt) { Err err; Value output(nullptr, int64_t(6)); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, &err); @@ -70,7 +71,7 @@ TEST_F(OutputConversionTest, StringBool) { Err err; Value output(nullptr, true); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, &err); @@ -84,7 +85,7 @@ output.list_value().push_back(Value(nullptr, "foo")); output.list_value().push_back(Value(nullptr, "bar")); output.list_value().push_back(Value(nullptr, int64_t(6))); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "string"), result, &err); @@ -102,7 +103,7 @@ std::string_view private_var_name("_private"); new_scope->SetValue(private_var_name, value, nullptr); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), Value(nullptr, "string"), result, &err); EXPECT_FALSE(err.has_error()); @@ -112,7 +113,7 @@ TEST_F(OutputConversionTest, ValueString) { Err err; Value output(nullptr, "foo bar"); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, &err); @@ -123,7 +124,7 @@ TEST_F(OutputConversionTest, ValueInt) { Err err; Value output(nullptr, int64_t(6)); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, &err); @@ -134,7 +135,7 @@ TEST_F(OutputConversionTest, ValueBool) { Err err; Value output(nullptr, true); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, &err); @@ -148,7 +149,7 @@ output.list_value().push_back(Value(nullptr, "foo")); output.list_value().push_back(Value(nullptr, "bar")); output.list_value().push_back(Value(nullptr, int64_t(6))); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, "value"), result, &err); @@ -166,7 +167,7 @@ std::string_view private_var_name("_private"); new_scope->SetValue(private_var_name, value, nullptr); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), Value(nullptr, "value"), result, &err); EXPECT_FALSE(err.has_error()); @@ -207,7 +208,7 @@ ] } })*"); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), Value(nullptr, std::move(new_scope)), Value(nullptr, "json"), result, &err); EXPECT_FALSE(err.has_error()); @@ -216,7 +217,7 @@ TEST_F(OutputConversionTest, ValueEmpty) { Err err; - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), Value(), Value(nullptr, ""), result, &err); EXPECT_FALSE(err.has_error()); EXPECT_EQ(result.str(), "<void>"); @@ -225,7 +226,7 @@ TEST_F(OutputConversionTest, DefaultValue) { Err err; Value output(nullptr, "foo bar"); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, ""), result, &err); EXPECT_FALSE(err.has_error()); @@ -239,7 +240,7 @@ output.list_value().push_back(Value(nullptr, "foo")); output.list_value().push_back(Value(nullptr, "")); output.list_value().push_back(Value(nullptr, "bar")); - StringOutputStream result; + std::ostringstream result; ConvertValueToOutput(settings(), output, Value(nullptr, ""), result, &err); EXPECT_FALSE(err.has_error()); @@ -253,7 +254,7 @@ Value(nullptr, "string"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "string"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -268,7 +269,7 @@ Value(nullptr, "list lines"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "list lines"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -283,7 +284,7 @@ Value(nullptr, "value"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -298,7 +299,7 @@ Value(nullptr, "value"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -313,7 +314,7 @@ Value(nullptr, "value"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -328,7 +329,7 @@ Value(nullptr, "scope"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "scope"), reverse, &err); EXPECT_FALSE(err.has_error()); @@ -342,7 +343,7 @@ Value(nullptr, "value"), &err); EXPECT_FALSE(err.has_error()); - StringOutputStream reverse; + std::ostringstream reverse; ConvertValueToOutput(settings(), result, Value(nullptr, "value"), reverse, &err); EXPECT_FALSE(err.has_error());
diff --git a/src/gn/output_stream.cc b/src/gn/output_stream.cc deleted file mode 100644 index 119aaab..0000000 --- a/src/gn/output_stream.cc +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright (c) 2025 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "gn/output_stream.h" - -#include <limits.h> - -OutputStream& OutputStream::operator<<(unsigned long long value) { - const size_t buffer_size = 24; - char buffer[buffer_size]; - char* end = buffer + buffer_size; - char* pos = end; - do { - *(--pos) = '0' + static_cast<char>(value % 10); - value /= 10; - } while (value != 0); - write(pos, static_cast<size_t>(end - pos)); - return *this; -} - -OutputStream& OutputStream::operator<<(long long value) { - const size_t buffer_size = 24; - char buffer[buffer_size]; - char* end = buffer + buffer_size; - char* pos = end; - - bool has_sign = (value < 0); - if (has_sign) { - // NOTE: |LLONG_MIN == -LLONG_MIN| must be handled here. - if (value == LLONG_MIN) { - *(--pos) = '8'; - value /= 10; - } - value = -value; - } - - do { - *(--pos) = '0' + static_cast<char>(value % 10); - value /= 10; - } while (value != 0); - if (has_sign) - *(--pos) = '-'; - write(pos, static_cast<size_t>(end - pos)); - return *this; -} - -OutputStream& OutputStream::operator<<(unsigned value) { - return *this << static_cast<unsigned long long>(value); -} - -OutputStream& OutputStream::operator<<(int value) { - return *this << static_cast<long long>(value); -} - -OutputStream& OutputStream::operator<<(unsigned long value) { - return *this << static_cast<unsigned long long>(value); -} - -OutputStream& OutputStream::operator<<(long value) { - return *this << static_cast<long long>(value); -} - -FileOutputStream::FileOutputStream(const char* utf8_path) { - file_ = fopen(utf8_path, "rw"); -} - -FileOutputStream::~FileOutputStream() { - fclose(file_); -} - -bool FileOutputStream::fail() const { - return ferror(file_) != 0; -} - -void FileOutputStream::write(const char* str, size_t len) { - fwrite(str, 1, len, file_); -} - -void FileOutputStream::put(char ch) { - fputc(ch, file_); -}
diff --git a/src/gn/output_stream.h b/src/gn/output_stream.h deleted file mode 100644 index 336c56d..0000000 --- a/src/gn/output_stream.h +++ /dev/null
@@ -1,109 +0,0 @@ -// Copyright (c) 2025 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef TOOLS_GN_OUTPUT_STREAM_H_ -#define TOOLS_GN_OUTPUT_STREAM_H_ - -#include <cstdint> -#include <cstdio> -#include <cstring> -#include <string> - -// GN generates a lot of text that it sends to various -// output streams. Initially, this was done using std::ostream -// but this interface (and implementation) is inefficient due -// to legacy feature requirements that GN does not need. -// -// OutputStream is an abstract interface for an output stream -// that provides a subset of the std::ostream API, but performs -// far faster. In practice, using it results in 6% faster -// `gn gen` times for large build plans that generate huge -// Ninja build plans. -class OutputStream { - public: - virtual ~OutputStream() {} - - // Add |len| bytes of data to the output stream. - virtual void write(const char* str, size_t len) = 0; - - // Add a single byte of data to the output stream. - virtual void put(char ch) = 0; - - // Convenience helpers for C literals and standard strings. - void write(const char* str) { write(str, ::strlen(str)); } - void write(const std::string& str) { write(str.data(), str.size()); } - - // Operator << overload for std::ostream compatibility. - OutputStream& operator<<(char ch) { - put(ch); - return *this; - } - OutputStream& operator<<(const char* str) { - write(str); - return *this; - } - OutputStream& operator<<(const std::string& str) { - write(str); - return *this; - } - OutputStream& operator<<(const std::string_view& str) { - write(str.data(), str.size()); - return *this; - } - - // Add decimal representations to the output stream. - OutputStream& operator<<(int value); - OutputStream& operator<<(long value); - OutputStream& operator<<(long long value); - OutputStream& operator<<(unsigned value); - OutputStream& operator<<(unsigned long value); - OutputStream& operator<<(unsigned long long value); -}; - -// A StringOutputStream stores all input into an std::string. -// This is a replacement for std::ostringstream. -class StringOutputStream : public OutputStream { - public: - // Constructor creates empty string. - StringOutputStream() {} - - virtual ~StringOutputStream() {} - - // Retrieve reference to result. - const std::string str() const { return str_; } - - // Move result out of the instance. - std::string release() { return std::move(str_); } - - // OutputStream overrides - void write(const char* str, size_t len) override { str_.append(str, len); } - void put(char ch) override { str_.push_back(ch); } - - protected: - std::string str_; -}; - -// A FileOutputStream writes all input into a file. -class FileOutputStream : public OutputStream { - public: - // Constructor opens a FILE instance in binary mode. - // Use fail() after the call to verify for errors. - FileOutputStream(const char* utf8_path); - - // Destructor closes the FILE instance. - virtual ~FileOutputStream(); - - // Return true if an error occured during construction - // or a write or put call. - bool fail() const; - - // OutputStream overrides. - void write(const char* str, size_t len) override; - void put(char ch) override; - - protected: - FILE* file_ = nullptr; -}; - -#endif // TOOLS_GN_OUTPUT_STREAM_H_
diff --git a/src/gn/output_stream_unittest.cc b/src/gn/output_stream_unittest.cc deleted file mode 100644 index 115e9e9..0000000 --- a/src/gn/output_stream_unittest.cc +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright (c) 2025 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "gn/output_stream.h" - -#include <limits> - -#include "util/test/test.h" - -TEST(OutputStream, AppendIntDecimals) { - static const int kValues[] = { - 0, 1, -1, 12345678, -12345678, INT_MIN, INT_MAX, - }; - for (const auto value : kValues) { - char expected[20]; - snprintf(expected, sizeof(expected), "%d", value); - - StringOutputStream s; - s << value; - EXPECT_EQ(s.str(), expected) << value; - } -} - -TEST(OutputStream, AppendUIntDecimals) { - static const unsigned kValues[] = { - 0, - 1, - 12345678, - UINT_MAX, - }; - for (const auto value : kValues) { - char expected[20]; - snprintf(expected, sizeof(expected), "%u", value); - - StringOutputStream s; - s << value; - EXPECT_EQ(s.str(), expected) << value; - } -} - -TEST(OutputStream, AppendLongDecimals) { - static const long kValues[] = { - 0, 1, -1, 12345678, -12345678, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, - }; - for (const auto value : kValues) { - char expected[32]; - snprintf(expected, sizeof(expected), "%ld", value); - - StringOutputStream s; - s << value; - - EXPECT_EQ(s.str(), expected) << value; - } -} - -TEST(OutputStream, AppendULongDecimals) { - static const unsigned long kValues[] = { - 0, 1, 12345678, UINT_MAX, ULONG_MAX, - }; - for (const auto value : kValues) { - char expected[32]; - snprintf(expected, sizeof(expected), "%lu", value); - - StringOutputStream s; - s << value; - EXPECT_EQ(s.str(), expected) << value; - } -} - -TEST(OutputStream, AppendLongLongDecimals) { - static const long long kValues[] = { - 0, 1, -1, 12345678, -12345678, INT_MIN, - INT_MAX, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, - }; - for (const auto value : kValues) { - char expected[48]; - snprintf(expected, sizeof(expected), "%lld", value); - - StringOutputStream s; - s << value; - EXPECT_EQ(s.str(), expected) << value; - } -} - -TEST(OutputStream, AppendULongLongDecimals) { - static const unsigned long long kValues[] = { - 0, 1, 12345678, UINT_MAX, ULONG_MAX, ULLONG_MAX, - }; - for (const auto value : kValues) { - char expected[48]; - snprintf(expected, sizeof(expected), "%llu", value); - - StringOutputStream s; - s << value; - EXPECT_EQ(s.str(), expected) << value; - } -}
diff --git a/src/gn/parser.cc b/src/gn/parser.cc index b05cebb..96739a5 100644 --- a/src/gn/parser.cc +++ b/src/gn/parser.cc
@@ -10,7 +10,6 @@ #include "base/logging.h" #include "gn/functions.h" #include "gn/operators.h" -#include "gn/output_stream.h" #include "gn/token.h" const char kGrammar_Help[] = @@ -897,21 +896,23 @@ return std::string(value, ' '); } -void RenderToText(const base::Value& node, int indent_level, OutputStream& os) { +void RenderToText(const base::Value& node, + int indent_level, + std::ostringstream& os) { const base::Value* child = node.FindKey(std::string("child")); std::string node_type(node.FindKey("type")->GetString()); if (node_type == "ACCESSOR") { // AccessorNode is a bit special, in that it holds a Token, not a ParseNode // for the base. - os << IndentFor(indent_level) << node_type << "\n"; + os << IndentFor(indent_level) << node_type << std::endl; os << IndentFor(indent_level + 1) << node.FindKey("value")->GetString() - << "\n"; + << std::endl; } else { os << IndentFor(indent_level) << node_type; if (node.FindKey("value")) { os << "(" << node.FindKey("value")->GetString() << ")"; } - os << "\n"; + os << std::endl; } if (node.FindKey(kJsonBeforeComment)) { for (auto& v : node.FindKey(kJsonBeforeComment)->GetList()) {
diff --git a/src/gn/parser.h b/src/gn/parser.h index f92429c..b323028 100644 --- a/src/gn/parser.h +++ b/src/gn/parser.h
@@ -15,8 +15,6 @@ #include "gn/err.h" #include "gn/parse_tree.h" -class OutputStream; - extern const char kGrammar_Help[]; struct ParserHelper; @@ -153,6 +151,8 @@ // Renders parse subtree as a formatted text, indenting by the given number of // spaces. -void RenderToText(const base::Value& node, int indent_level, OutputStream& os); +void RenderToText(const base::Value& node, + int indent_level, + std::ostringstream& os); #endif // TOOLS_GN_PARSER_H_
diff --git a/src/gn/parser_unittest.cc b/src/gn/parser_unittest.cc index d850551..8cfdb8d 100644 --- a/src/gn/parser_unittest.cc +++ b/src/gn/parser_unittest.cc
@@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/parser.h" +#include <sstream> + #include "gn/input_file.h" -#include "gn/output_stream.h" +#include "gn/parser.h" #include "gn/tokenizer.h" #include "util/test/test.h" @@ -29,7 +30,7 @@ err.PrintToStdout(); ASSERT_TRUE(result); - StringOutputStream collector; + std::ostringstream collector; RenderToText(result->GetJSONNode(), 0, collector); EXPECT_EQ(expected, collector.str()); @@ -45,7 +46,7 @@ std::unique_ptr<ParseNode> result = Parser::ParseExpression(tokens, &err); ASSERT_TRUE(result); - StringOutputStream collector; + std::ostringstream collector; RenderToText(result->GetJSONNode(), 0, collector); EXPECT_EQ(expected, collector.str());
diff --git a/src/gn/path_output.cc b/src/gn/path_output.cc index 74c336d..86c92e6 100644 --- a/src/gn/path_output.cc +++ b/src/gn/path_output.cc
@@ -7,7 +7,6 @@ #include "base/strings/string_util.h" #include "gn/filesystem_utils.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/string_utils.h" #include "util/build_config.h" @@ -23,11 +22,11 @@ PathOutput::~PathOutput() = default; -void PathOutput::WriteFile(OutputStream& out, const SourceFile& file) const { +void PathOutput::WriteFile(std::ostream& out, const SourceFile& file) const { WritePathStr(out, file.value()); } -void PathOutput::WriteDir(OutputStream& out, +void PathOutput::WriteDir(std::ostream& out, const SourceDir& dir, DirSlashEnding slash_ending) const { if (dir.value() == "/") { @@ -70,12 +69,12 @@ } } -void PathOutput::WriteFile(OutputStream& out, const OutputFile& file) const { +void PathOutput::WriteFile(std::ostream& out, const OutputFile& file) const { // Here we assume that the path is already preprocessed. EscapeStringToStream(out, file.value(), options_); } -void PathOutput::WriteFiles(OutputStream& out, +void PathOutput::WriteFiles(std::ostream& out, const std::vector<SourceFile>& files) const { for (const auto& file : files) { out << " "; @@ -83,7 +82,7 @@ } } -void PathOutput::WriteFiles(OutputStream& out, +void PathOutput::WriteFiles(std::ostream& out, const std::vector<OutputFile>& files) const { for (const auto& file : files) { out << " "; @@ -91,7 +90,7 @@ } } -void PathOutput::WriteFiles(OutputStream& out, +void PathOutput::WriteFiles(std::ostream& out, const UniqueVector<OutputFile>& files) const { for (const auto& file : files) { out << " "; @@ -99,7 +98,7 @@ } } -void PathOutput::WriteDir(OutputStream& out, +void PathOutput::WriteDir(std::ostream& out, const OutputFile& file, DirSlashEnding slash_ending) const { DCHECK(file.value().empty() || file.value()[file.value().size() - 1] == '/'); @@ -123,13 +122,13 @@ } } -void PathOutput::WriteFile(OutputStream& out, +void PathOutput::WriteFile(std::ostream& out, const base::FilePath& file) const { // Assume native file paths are always absolute. EscapeStringToStream(out, FilePathToUTF8(file), options_); } -void PathOutput::WriteSourceRelativeString(OutputStream& out, +void PathOutput::WriteSourceRelativeString(std::ostream& out, std::string_view str) const { if (options_.mode == ESCAPE_NINJA_COMMAND) { // Shell escaping needs an intermediate string since it may end up @@ -151,7 +150,7 @@ } } -void PathOutput::WritePathStr(OutputStream& out, std::string_view str) const { +void PathOutput::WritePathStr(std::ostream& out, std::string_view str) const { DCHECK(str.size() > 0 && str[0] == '/'); if (str.substr(0, current_dir_.value().size()) ==
diff --git a/src/gn/path_output.h b/src/gn/path_output.h index 3fced0a..3b973d6 100644 --- a/src/gn/path_output.h +++ b/src/gn/path_output.h
@@ -14,7 +14,6 @@ #include "gn/unique_vector.h" class OutputFile; -class OutputStream; class SourceFile; namespace base { @@ -49,35 +48,35 @@ void set_inhibit_quoting(bool iq) { options_.inhibit_quoting = iq; } void set_escape_platform(EscapingPlatform p) { options_.platform = p; } - void WriteFile(OutputStream& out, const SourceFile& file) const; - void WriteFile(OutputStream& out, const OutputFile& file) const; - void WriteFile(OutputStream& out, const base::FilePath& file) const; + void WriteFile(std::ostream& out, const SourceFile& file) const; + void WriteFile(std::ostream& out, const OutputFile& file) const; + void WriteFile(std::ostream& out, const base::FilePath& file) const; // Writes the given SourceFiles/OutputFiles with spaces separating them. This // will also write an initial space before the first item. - void WriteFiles(OutputStream& out, const std::vector<SourceFile>& file) const; - void WriteFiles(OutputStream& out, + void WriteFiles(std::ostream& out, const std::vector<SourceFile>& file) const; + void WriteFiles(std::ostream& out, const std::vector<OutputFile>& files) const; - void WriteFiles(OutputStream& out, + void WriteFiles(std::ostream& out, const UniqueVector<OutputFile>& files) const; // This variant assumes the dir ends in a trailing slash or is empty. - void WriteDir(OutputStream& out, + void WriteDir(std::ostream& out, const SourceDir& dir, DirSlashEnding slash_ending) const; - void WriteDir(OutputStream& out, + void WriteDir(std::ostream& out, const OutputFile& file, DirSlashEnding slash_ending) const; // Backend for WriteFile and WriteDir. This appends the given file or // directory string to the file. - void WritePathStr(OutputStream& out, std::string_view str) const; + void WritePathStr(std::ostream& out, std::string_view str) const; private: // Takes the given string and writes it out, appending to the inverse // current dir. This assumes leading slashes have been trimmed. - void WriteSourceRelativeString(OutputStream& out, std::string_view str) const; + void WriteSourceRelativeString(std::ostream& out, std::string_view str) const; SourceDir current_dir_;
diff --git a/src/gn/path_output_unittest.cc b/src/gn/path_output_unittest.cc index e137522..1debb64 100644 --- a/src/gn/path_output_unittest.cc +++ b/src/gn/path_output_unittest.cc
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/path_output.h" +#include <sstream> + #include "base/files/file_path.h" #include "gn/output_file.h" -#include "gn/output_stream.h" +#include "gn/path_output.h" #include "gn/source_dir.h" #include "gn/source_file.h" #include "util/build_config.h" @@ -17,19 +18,19 @@ PathOutput writer(build_dir, source_root, ESCAPE_NONE); { // Normal source-root path. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/bar.cc")); EXPECT_EQ("../../foo/bar.cc", out.str()); } { // File in the root dir. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo.cc")); EXPECT_EQ("../../foo.cc", out.str()); } { // Files in the output dir. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//out/Debug/foo.cc")); out << " "; writer.WriteFile(out, SourceFile("//out/Debug/bar/baz.cc")); @@ -38,14 +39,14 @@ #if defined(OS_WIN) { // System-absolute path. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("/C:/foo/bar.cc")); EXPECT_EQ("C:/foo/bar.cc", out.str()); } #else { // System-absolute path. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("/foo/bar.cc")); EXPECT_EQ("/foo/bar.cc", out.str()); } @@ -59,13 +60,13 @@ PathOutput writer(build_dir, source_root, ESCAPE_NONE); { // Normal source-root path. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/bar.cc")); EXPECT_EQ("foo/bar.cc", out.str()); } { // File in the root dir. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo.cc")); EXPECT_EQ("foo.cc", out.str()); } @@ -77,13 +78,13 @@ PathOutput writer(build_dir, source_root, ESCAPE_NINJA); { // Spaces and $ in filenames. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/foo bar$.cc")); EXPECT_EQ("../../foo/foo$ bar$$.cc", out.str()); } { // Not other weird stuff - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/\"foo\".cc")); EXPECT_EQ("../../foo/\"foo\".cc", out.str()); } @@ -97,7 +98,7 @@ // Spaces in filenames should get quoted on Windows. writer.set_escape_platform(ESCAPE_PLATFORM_WIN); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); EXPECT_EQ("\"../../foo/foo$ bar.cc\"", out.str()); } @@ -105,7 +106,7 @@ // Spaces in filenames should get escaped on Posix. writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); EXPECT_EQ("../../foo/foo\\$ bar.cc", out.str()); } @@ -113,7 +114,7 @@ // Quotes should get blackslash-escaped on Windows and Posix. writer.set_escape_platform(ESCAPE_PLATFORM_WIN); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/\"foobar\".cc")); // Our Windows code currently quotes the whole thing in this case for // code simplicity, even though it's strictly unnecessary. This might @@ -122,7 +123,7 @@ } writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/\"foobar\".cc")); EXPECT_EQ("../../foo/\\\"foobar\\\".cc", out.str()); } @@ -130,13 +131,13 @@ // Backslashes should get escaped on non-Windows and preserved on Windows. writer.set_escape_platform(ESCAPE_PLATFORM_WIN); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, OutputFile("foo\\bar.cc")); EXPECT_EQ("foo\\bar.cc", out.str()); } writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); { - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, OutputFile("foo\\bar.cc")); EXPECT_EQ("foo\\\\bar.cc", out.str()); } @@ -151,7 +152,7 @@ writer.set_escape_platform(ESCAPE_PLATFORM_WIN); { // We should get unescaped spaces in the output with no quotes. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); EXPECT_EQ("../../foo/foo$ bar.cc", out.str()); } @@ -159,7 +160,7 @@ writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); { // Escapes the space. - StringOutputStream out; + std::ostringstream out; writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); EXPECT_EQ("../../foo/foo\\$ bar.cc", out.str()); } @@ -171,13 +172,13 @@ std::string_view source_root("/source/root"); PathOutput writer(build_dir, source_root, ESCAPE_NINJA); { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//foo/bar/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("../../foo/bar/", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//foo/bar/"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ("../../foo/bar", out.str()); @@ -185,54 +186,54 @@ // Output source root dir. { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("../../", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ("../..", out.str()); } // Output system root dir. { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("/", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("/", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("/"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ("/.", out.str()); } // Output inside current dir. { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//out/Debug/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("./", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//out/Debug/"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ(".", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//out/Debug/foo/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("foo/", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, SourceDir("//out/Debug/foo/"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ("foo", out.str()); @@ -240,18 +241,18 @@ // WriteDir using an OutputFile. { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, OutputFile("foo/"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("foo/", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, OutputFile("foo/"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ("foo", out.str()); } { - StringOutputStream out; + std::ostringstream out; writer.WriteDir(out, OutputFile(), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("", out.str()); } @@ -261,13 +262,13 @@ std::string_view source_root("/source/root"); PathOutput root_writer(SourceDir("//"), source_root, ESCAPE_NINJA); { - StringOutputStream out; + std::ostringstream out; root_writer.WriteDir(out, SourceDir("//"), PathOutput::DIR_INCLUDE_LAST_SLASH); EXPECT_EQ("./", out.str()); } { - StringOutputStream out; + std::ostringstream out; root_writer.WriteDir(out, SourceDir("//"), PathOutput::DIR_NO_LAST_SLASH); EXPECT_EQ(".", out.str()); }
diff --git a/src/gn/pool.cc b/src/gn/pool.cc index 740f1d2..60049a1 100644 --- a/src/gn/pool.cc +++ b/src/gn/pool.cc
@@ -4,8 +4,9 @@ #include "gn/pool.h" +#include <sstream> + #include "base/logging.h" -#include "gn/output_stream.h" Pool::~Pool() = default; @@ -24,7 +25,7 @@ } std::string Pool::GetNinjaName(bool include_toolchain) const { - StringOutputStream buffer; + std::ostringstream buffer; if (include_toolchain) { DCHECK(label().toolchain_dir().is_source_absolute()); std::string toolchain_dir = label().toolchain_dir().value();
diff --git a/src/gn/qt_creator_writer.cc b/src/gn/qt_creator_writer.cc index 2e9ee0b..94fed8f 100644 --- a/src/gn/qt_creator_writer.cc +++ b/src/gn/qt_creator_writer.cc
@@ -6,6 +6,7 @@ #include <optional> #include <set> +#include <sstream> #include <string> #include "base/files/file_path.h" @@ -270,10 +271,11 @@ void QtCreatorWriter::GenerateFile(const base::FilePath::CharType* suffix, const std::set<std::string>& items) { const base::FilePath file_path = project_prefix_.AddExtension(suffix); - StringOutputBuffer output; + StringOutputBuffer storage; + std::ostream output(&storage); for (const std::string& item : items) - output << item << "\n"; - output.WriteToFileIfChanged(file_path, &err_); + output << item << std::endl; + storage.WriteToFileIfChanged(file_path, &err_); } void QtCreatorWriter::Run() {
diff --git a/src/gn/runtime_deps.cc b/src/gn/runtime_deps.cc index e121183..546d63e 100644 --- a/src/gn/runtime_deps.cc +++ b/src/gn/runtime_deps.cc
@@ -6,6 +6,7 @@ #include <map> #include <set> +#include <sstream> #include "base/command_line.h" #include "base/files/file_util.h" @@ -211,12 +212,13 @@ base::FilePath data_deps_file = target->settings()->build_settings()->GetFullPath(output_as_source); - StringOutputBuffer contents; + StringOutputBuffer storage; + std::ostream contents(&storage); for (const auto& pair : ComputeRuntimeDeps(target)) - contents << pair.first.value() << "\n"; + contents << pair.first.value() << std::endl; ScopedTrace trace(TraceItem::TRACE_FILE_WRITE, output_as_source.value()); - return contents.WriteToFileIfChanged(data_deps_file, err); + return storage.WriteToFileIfChanged(data_deps_file, err); } } // namespace
diff --git a/src/gn/rust_project_writer.cc b/src/gn/rust_project_writer.cc index 840c211..6c9aef8 100644 --- a/src/gn/rust_project_writer.cc +++ b/src/gn/rust_project_writer.cc
@@ -4,7 +4,9 @@ #include "gn/rust_project_writer.h" +#include <fstream> #include <optional> +#include <sstream> #include <tuple> #include "base/json/string_escape.h" @@ -70,7 +72,9 @@ std::vector<const Target*> all_targets = builder.GetAllResolvedTargets(); StringOutputBuffer out_buffer; - RenderJSON(build_settings, all_targets, out_buffer); + std::ostream out(&out_buffer); + + RenderJSON(build_settings, all_targets, out); return out_buffer.WriteToFileIfChanged(output_path, err); } @@ -244,7 +248,7 @@ void WriteCrates(const BuildSettings* build_settings, CrateList& crate_list, std::optional<std::string>& sysroot, - OutputStream& rust_project) { + std::ostream& rust_project) { rust_project << "{" NEWLINE; // If a sysroot was found, then that can be used to tell rust-analyzer where @@ -386,7 +390,7 @@ void RustProjectWriter::RenderJSON(const BuildSettings* build_settings, std::vector<const Target*>& all_targets, - OutputStream& rust_project) { + std::ostream& rust_project) { TargetIndexMap lookup; CrateList crate_list; std::optional<std::string> rust_sysroot;
diff --git a/src/gn/rust_project_writer.h b/src/gn/rust_project_writer.h index 8af7bf1..3fbdedb 100644 --- a/src/gn/rust_project_writer.h +++ b/src/gn/rust_project_writer.h
@@ -10,7 +10,6 @@ class Builder; class BuildSettings; -class OutputStream; // rust-project.json is an output format describing the rust build graph. It is // used by rust-analyzer (a LSP server), similar to compile-commands.json. @@ -28,7 +27,7 @@ Err* err); static void RenderJSON(const BuildSettings* build_settings, std::vector<const Target*>& all_targets, - OutputStream& rust_project); + std::ostream& rust_project); private: // This function visits the deps graph of a target in a DFS fashion.
diff --git a/src/gn/rust_project_writer_helpers.h b/src/gn/rust_project_writer_helpers.h index 864b7d0..3073fd5 100644 --- a/src/gn/rust_project_writer_helpers.h +++ b/src/gn/rust_project_writer_helpers.h
@@ -5,7 +5,9 @@ #ifndef TOOLS_GN_RUST_PROJECT_WRITER_HELPERS_H_ #define TOOLS_GN_RUST_PROJECT_WRITER_HELPERS_H_ +#include <fstream> #include <optional> +#include <sstream> #include <string> #include <string_view> #include <tuple> @@ -17,8 +19,6 @@ #include "gn/source_file.h" #include "gn/target.h" -class OutputStream; - // These are internal types and helper functions for RustProjectWriter that have // been extracted for easier testability. @@ -130,7 +130,7 @@ void WriteCrates(const BuildSettings* build_settings, CrateList& crate_list, std::optional<std::string>& sysroot, - OutputStream& rust_project); + std::ostream& rust_project); // Assemble the compiler arguments for the given GN Target. std::vector<std::string> ExtractCompilerArgs(const Target* target);
diff --git a/src/gn/rust_project_writer_helpers_unittest.cc b/src/gn/rust_project_writer_helpers_unittest.cc index 13d6b47..87ccd83 100644 --- a/src/gn/rust_project_writer_helpers_unittest.cc +++ b/src/gn/rust_project_writer_helpers_unittest.cc
@@ -40,7 +40,7 @@ crates.push_back(dep); crates.push_back(target); - StringOutputStream stream; + std::ostringstream stream; WriteCrates(setup.build_settings(), crates, sysroot, stream); std::string out = stream.str(); #if defined(OS_WIN) @@ -101,7 +101,7 @@ std::optional<std::string> sysroot = "sysroot"; CrateList crates; - StringOutputStream stream; + std::ostringstream stream; WriteCrates(setup.build_settings(), crates, sysroot, stream); std::string out = stream.str(); #if defined(OS_WIN)
diff --git a/src/gn/rust_project_writer_unittest.cc b/src/gn/rust_project_writer_unittest.cc index 66948e3..f0b806b 100644 --- a/src/gn/rust_project_writer_unittest.cc +++ b/src/gn/rust_project_writer_unittest.cc
@@ -6,7 +6,6 @@ #include "base/files/file_path.h" #include "base/strings/string_util.h" #include "gn/filesystem_utils.h" -#include "gn/output_stream.h" #include "gn/substitution_list.h" #include "gn/target.h" #include "gn/test_with_scheduler.h" @@ -42,7 +41,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -107,7 +106,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -205,7 +204,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -342,7 +341,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -445,7 +444,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -500,7 +499,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -555,7 +554,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream); @@ -611,7 +610,7 @@ target.SetToolchain(setup.toolchain()); ASSERT_TRUE(target.OnResolved(&err)); - StringOutputStream stream; + std::ostringstream stream; std::vector<const Target*> targets; targets.push_back(&target); RustProjectWriter::RenderJSON(setup.build_settings(), targets, stream);
diff --git a/src/gn/setup.cc b/src/gn/setup.cc index d907a6c..912f378 100644 --- a/src/gn/setup.cc +++ b/src/gn/setup.cc
@@ -8,6 +8,7 @@ #include <algorithm> #include <memory> +#include <sstream> #include <utility> #include "base/command_line.h"
diff --git a/src/gn/string_output_buffer.cc b/src/gn/string_output_buffer.cc index 53af53e..c5d91ff 100644 --- a/src/gn/string_output_buffer.cc +++ b/src/gn/string_output_buffer.cc
@@ -4,14 +4,13 @@ #include "gn/string_output_buffer.h" -#include <fstream> - #include "base/files/file_path.h" #include "base/files/file_util.h" #include "gn/err.h" #include "gn/file_writer.h" #include "gn/filesystem_utils.h" -#include "gn/output_stream.h" + +#include <fstream> std::string StringOutputBuffer::str() const { std::string result;
diff --git a/src/gn/string_output_buffer.h b/src/gn/string_output_buffer.h index 04e27dd..2338860 100644 --- a/src/gn/string_output_buffer.h +++ b/src/gn/string_output_buffer.h
@@ -7,18 +7,16 @@ #include <array> #include <memory> +#include <streambuf> #include <string> #include <string_view> #include <vector> -#include "gn/output_stream.h" - namespace base { class FilePath; } // namespace base class Err; -class OutputStream; // An append-only very large storage area for string data. Useful for the parts // of GN that need to generate huge output files (e.g. --ide=json will create @@ -30,11 +28,11 @@ // // 2) Use operator<<, or Append() to append data to the instance. // -// 3) Alternatively, create an OutputStream that takes its address as +// 3) Alternatively, create an std::ostream that takes its address as // argument, then use the output stream as usual to append data to it. // // StringOutputBuffer storage; -// OutputStream out(&storage); +// std::ostream out(&storage); // out << "Hello world!"; // // 4) Use ContentsEqual() to compare the instance's content with that of a @@ -42,7 +40,7 @@ // // 5) Use WriteToFile() to write the content to a given file. // -class StringOutputBuffer : public OutputStream { +class StringOutputBuffer : public std::streambuf { public: StringOutputBuffer() = default; @@ -74,9 +72,18 @@ static size_t GetPageSizeForTesting() { return kPageSize; } - // OutputStream overrides - void put(char ch) override { Append(ch); } - void write(const char* str, size_t len) override { Append(str, len); } + protected: + // Called by std::ostream to write |n| chars from |s|. + std::streamsize xsputn(const char* s, std::streamsize n) override { + Append(s, static_cast<size_t>(n)); + return n; + } + + // Called by std::ostream to write a single character. + int_type overflow(int_type ch) override { + Append(static_cast<char>(ch)); + return 1; + } private: // Return the number of free bytes in the current page.
diff --git a/src/gn/string_output_buffer_unittest.cc b/src/gn/string_output_buffer_unittest.cc index b80a3be..6dcb741 100644 --- a/src/gn/string_output_buffer_unittest.cc +++ b/src/gn/string_output_buffer_unittest.cc
@@ -69,11 +69,12 @@ const size_t span_size = data_size / num_spans; StringOutputBuffer buffer; + std::ostream out(&buffer); for (size_t n = 0; n < num_spans; ++n) { size_t start_offset = n * span_size; size_t end_offset = std::min(start_offset + span_size, data.size()); - buffer << std::string_view(&data[start_offset], end_offset - start_offset); + out << std::string_view(&data[start_offset], end_offset - start_offset); } EXPECT_EQ(data.size(), buffer.size());
diff --git a/src/gn/substitution_writer.cc b/src/gn/substitution_writer.cc index f49abc4..c9624d7 100644 --- a/src/gn/substitution_writer.cc +++ b/src/gn/substitution_writer.cc
@@ -9,7 +9,6 @@ #include "gn/escape.h" #include "gn/filesystem_utils.h" #include "gn/output_file.h" -#include "gn/output_stream.h" #include "gn/rust_substitution_type.h" #include "gn/rust_tool.h" #include "gn/settings.h" @@ -151,7 +150,7 @@ void SubstitutionWriter::WriteWithNinjaVariables( const SubstitutionPattern& pattern, const EscapeOptions& escape_options, - OutputStream& out) { + std::ostream& out) { // The result needs to be quoted as if it was one string, but the $ for // the inserted Ninja variables can't be escaped. So write to a buffer with // no quoting, and then quote the whole thing if necessary. @@ -323,7 +322,7 @@ const SourceFile& source, const std::vector<const Substitution*>& types, const EscapeOptions& escape_options, - OutputStream& out) { + std::ostream& out) { for (const auto& type : types) { // Don't write SOURCE since that just maps to Ninja's $in variable, which // is implicit in the rule. RESPONSE_FILE_NAME is written separately @@ -336,7 +335,7 @@ GetSourceSubstitution(target, settings, source, type, OUTPUT_RELATIVE, settings->build_settings()->build_dir()), escape_options); - out << "\n"; + out << std::endl; } } }
diff --git a/src/gn/substitution_writer.h b/src/gn/substitution_writer.h index 73f5cda..95e4b94 100644 --- a/src/gn/substitution_writer.h +++ b/src/gn/substitution_writer.h
@@ -13,7 +13,6 @@ struct EscapeOptions; class OutputFile; -class OutputStream; class Settings; class SourceDir; class SourceFile; @@ -63,7 +62,7 @@ // Ninja variables replacing the patterns. static void WriteWithNinjaVariables(const SubstitutionPattern& pattern, const EscapeOptions& escape_options, - OutputStream& out); + std::ostream& out); // NOP substitutions --------------------------------------------------------- @@ -158,7 +157,7 @@ const SourceFile& source, const std::vector<const Substitution*>& types, const EscapeOptions& escape_options, - OutputStream& out); + std::ostream& out); // Extracts the given type of substitution related to a source file from the // given source file. If output_style is OUTPUT_RELATIVE, relative_to
diff --git a/src/gn/substitution_writer_unittest.cc b/src/gn/substitution_writer_unittest.cc index 152adb5..eaa521a 100644 --- a/src/gn/substitution_writer_unittest.cc +++ b/src/gn/substitution_writer_unittest.cc
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gn/substitution_writer.h" +#include <sstream> + #include "gn/c_substitution_type.h" #include "gn/err.h" #include "gn/escape.h" -#include "gn/output_stream.h" #include "gn/substitution_list.h" #include "gn/substitution_pattern.h" +#include "gn/substitution_writer.h" #include "gn/target.h" #include "gn/test_with_scope.h" #include "util/build_config.h" @@ -76,7 +77,7 @@ EscapeOptions options; options.mode = ESCAPE_NONE; - StringOutputStream out; + std::ostringstream out; SubstitutionWriter::WriteNinjaVariablesForSource( nullptr, setup.settings(), SourceFile("//foo/bar/baz.txt"), types, options, out); @@ -99,7 +100,7 @@ EscapeOptions options; options.mode = ESCAPE_NONE; - StringOutputStream out; + std::ostringstream out; SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out); EXPECT_EQ("-i ${in} --out=bar\"${source_name_part}\".o", out.str());
diff --git a/src/gn/trace.cc b/src/gn/trace.cc index 8a16f14..5f07353 100644 --- a/src/gn/trace.cc +++ b/src/gn/trace.cc
@@ -9,6 +9,7 @@ #include <algorithm> #include <map> #include <mutex> +#include <sstream> #include <vector> #include "base/command_line.h" @@ -19,7 +20,6 @@ #include "base/strings/stringprintf.h" #include "gn/filesystem_utils.h" #include "gn/label.h" -#include "gn/output_stream.h" namespace { @@ -72,18 +72,18 @@ return a.total_duration > b.total_duration; } -void SummarizeParses(std::vector<const TraceItem*>& loads, OutputStream& out) { +void SummarizeParses(std::vector<const TraceItem*>& loads, std::ostream& out) { out << "File parse times: (time in ms, name)\n"; std::sort(loads.begin(), loads.end(), &DurationGreater); for (auto* load : loads) { out << base::StringPrintf(" %8.2f ", load->delta().InMillisecondsF()); - out << load->name() << "\n"; + out << load->name() << std::endl; } } void SummarizeCoalesced(std::vector<const TraceItem*>& items, - OutputStream& out) { + std::ostream& out) { // Group by file name. std::map<std::string, Coalesced> coalesced; for (auto* item : items) { @@ -101,18 +101,18 @@ for (const auto& cur : sorted) { out << base::StringPrintf(" %8.2f %d ", cur.total_duration, cur.count); - out << *cur.name_ptr << "\n"; + out << *cur.name_ptr << std::endl; } } void SummarizeFileExecs(std::vector<const TraceItem*>& execs, - OutputStream& out) { + std::ostream& out) { out << "File execute times: (total time in ms, # executions, name)\n"; SummarizeCoalesced(execs, out); } void SummarizeScriptExecs(std::vector<const TraceItem*>& execs, - OutputStream& out) { + std::ostream& out) { out << "Script execute times: (total time in ms, # executions, name)\n"; SummarizeCoalesced(execs, out); } @@ -223,13 +223,13 @@ } } - StringOutputStream out; + std::ostringstream out; SummarizeParses(parses, out); - out << "\n"; + out << std::endl; SummarizeFileExecs(file_execs, out); - out << "\n"; + out << std::endl; SummarizeScriptExecs(script_execs, out); - out << "\n"; + out << std::endl; // Generally there will only be one header check, but it's theoretically // possible for more than one to run if more than one build is going in @@ -248,7 +248,7 @@ } void SaveTraces(const base::FilePath& file_name) { - StringOutputStream out; + std::ostringstream out; out << "{\"traceEvents\":[";
diff --git a/src/gn/visual_studio_writer.cc b/src/gn/visual_studio_writer.cc index 19e903d..243fedd 100644 --- a/src/gn/visual_studio_writer.cc +++ b/src/gn/visual_studio_writer.cc
@@ -22,7 +22,6 @@ #include "gn/deps_iterator.h" #include "gn/filesystem_utils.h" #include "gn/label_pattern.h" -#include "gn/output_stream.h" #include "gn/parse_tree.h" #include "gn/path_output.h" #include "gn/standard_out.h" @@ -39,7 +38,7 @@ namespace { struct SemicolonSeparatedWriter { - void operator()(const std::string& value, OutputStream& out) const { + void operator()(const std::string& value, std::ostream& out) const { out << XmlEscape(value) + ';'; } }; @@ -49,7 +48,7 @@ : path_output_(path_output) {} ~IncludeDirWriter() = default; - void operator()(const SourceDir& dir, OutputStream& out) const { + void operator()(const SourceDir& dir, std::ostream& out) const { path_output_.WriteDir(out, dir, PathOutput::DIR_NO_LAST_SLASH); out << ";"; } @@ -62,7 +61,7 @@ : path_output_(path_output), source_file_(source_file) {} ~SourceFileWriter() = default; - void operator()(OutputStream& out) const { + void operator()(std::ostream& out) const { path_output_.WriteFile(out, source_file_); } @@ -429,8 +428,9 @@ project_config_platform)); StringOutputBuffer vcxproj_storage; + std::ostream vcxproj_string_out(&vcxproj_storage); SourceFileCompileTypePairs source_types; - if (!WriteProjectFileContents(vcxproj_storage, *projects_.back(), target, + if (!WriteProjectFileContents(vcxproj_string_out, *projects_.back(), target, ninja_extra_args, ninja_executable, &source_types, err)) { projects_.pop_back(); @@ -446,12 +446,13 @@ base::FilePath filters_path = UTF8ToFilePath(vcxproj_path_str + ".filters"); StringOutputBuffer filters_storage; - WriteFiltersFileContents(filters_storage, target, source_types); + std::ostream filters_string_out(&filters_storage); + WriteFiltersFileContents(filters_string_out, target, source_types); return filters_storage.WriteToFileIfChanged(filters_path, err); } bool VisualStudioWriter::WriteProjectFileContents( - OutputStream& out, + std::ostream& out, const SolutionProject& solution_project, const Target* target, const std::string& ninja_extra_args, @@ -462,7 +463,7 @@ GetBuildDirForTargetAsSourceDir(target, BuildDirType::OBJ), build_settings_->root_path_utf8(), EscapingMode::ESCAPE_NONE); - out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; + out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl; XmlElementWriter project( out, "Project", XmlAttributes("DefaultTargets", "Build") @@ -684,16 +685,16 @@ } void VisualStudioWriter::WriteFiltersFileContents( - OutputStream& out, + std::ostream& out, const Target* target, const SourceFileCompileTypePairs& source_types) { - out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; + out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl; XmlElementWriter project( out, "Project", XmlAttributes("ToolsVersion", "4.0") .add("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003")); - StringOutputStream files_out; + std::ostringstream files_out; { std::unique_ptr<XmlElementWriter> filters_group = @@ -717,7 +718,7 @@ file_and_type.compile_type, "Include", SourceFileWriter(file_path_output, *file_and_type.file)); - StringOutputStream target_relative_out; + std::ostringstream target_relative_out; filter_path_output.WriteFile(target_relative_out, *file_and_type.file); std::string target_relative_path = target_relative_out.str(); ConvertPathToSystem(&target_relative_path); @@ -755,7 +756,8 @@ base::FilePath sln_path = build_settings_->GetFullPath(sln_file); StringOutputBuffer storage; - WriteSolutionFileContents(storage, sln_path.DirName()); + std::ostream string_out(&storage); + WriteSolutionFileContents(string_out, sln_path.DirName()); // Only write the content to the file if it's different. That is // both a performance optimization and more importantly, prevents @@ -764,64 +766,66 @@ } void VisualStudioWriter::WriteSolutionFileContents( - OutputStream& out, + std::ostream& out, const base::FilePath& solution_dir_path) { - out << "Microsoft Visual Studio Solution File, Format Version 12.00\n"; - out << "# " << version_string_ << "\n"; + out << "Microsoft Visual Studio Solution File, Format Version 12.00" + << std::endl; + out << "# " << version_string_ << std::endl; SourceDir solution_dir(FilePathToUTF8(solution_dir_path)); for (const std::unique_ptr<SolutionEntry>& folder : folders_) { out << "Project(\"" << kGuidTypeFolder << "\") = \"(" << folder->name << ")\", \"" << RebasePath(folder->path, solution_dir) << "\", \"" - << folder->guid << "\"\n"; - out << "EndProject\n"; + << folder->guid << "\"" << std::endl; + out << "EndProject" << std::endl; } for (const std::unique_ptr<SolutionProject>& project : projects_) { out << "Project(\"" << kGuidTypeProject << "\") = \"" << project->name << "\", \"" << RebasePath(project->path, solution_dir) << "\", \"" - << project->guid << "\"\n"; - out << "EndProject\n"; + << project->guid << "\"" << std::endl; + out << "EndProject" << std::endl; } - out << "Global\n"; + out << "Global" << std::endl; out << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution" - << "\n"; + << std::endl; const std::string config_mode_prefix = std::string(kConfigurationName) + '|'; const std::string config_mode = config_mode_prefix + config_platform_; - out << "\t\t" << config_mode << " = " << config_mode << "\n"; - out << "\tEndGlobalSection\n"; + out << "\t\t" << config_mode << " = " << config_mode << std::endl; + out << "\tEndGlobalSection" << std::endl; - out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"; + out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution" + << std::endl; for (const std::unique_ptr<SolutionProject>& project : projects_) { const std::string project_config_mode = config_mode_prefix + project->config_platform; out << "\t\t" << project->guid << '.' << config_mode - << ".ActiveCfg = " << project_config_mode << "\n"; + << ".ActiveCfg = " << project_config_mode << std::endl; out << "\t\t" << project->guid << '.' << config_mode - << ".Build.0 = " << project_config_mode << "\n"; + << ".Build.0 = " << project_config_mode << std::endl; } - out << "\tEndGlobalSection\n"; + out << "\tEndGlobalSection" << std::endl; - out << "\tGlobalSection(SolutionProperties) = preSolution\n"; - out << "\t\tHideSolutionNode = FALSE\n"; - out << "\tEndGlobalSection\n"; + out << "\tGlobalSection(SolutionProperties) = preSolution" << std::endl; + out << "\t\tHideSolutionNode = FALSE" << std::endl; + out << "\tEndGlobalSection" << std::endl; - out << "\tGlobalSection(NestedProjects) = preSolution\n"; + out << "\tGlobalSection(NestedProjects) = preSolution" << std::endl; for (const std::unique_ptr<SolutionEntry>& folder : folders_) { if (folder->parent_folder) { out << "\t\t" << folder->guid << " = " << folder->parent_folder->guid - << "\n"; + << std::endl; } } for (const std::unique_ptr<SolutionProject>& project : projects_) { out << "\t\t" << project->guid << " = " << project->parent_folder->guid - << "\n"; + << std::endl; } - out << "\tEndGlobalSection\n"; + out << "\tEndGlobalSection" << std::endl; - out << "EndGlobal\n"; + out << "EndGlobal" << std::endl; } void VisualStudioWriter::ResolveSolutionFolders() { @@ -925,7 +929,7 @@ std::pair<std::string, bool> VisualStudioWriter::GetNinjaTarget( const Target* target) { - StringOutputStream ninja_target_out; + std::ostringstream ninja_target_out; bool is_phony = false; OutputFile output_file; if (target->has_dependency_output_file()) {
diff --git a/src/gn/visual_studio_writer.h b/src/gn/visual_studio_writer.h index e725744..7161481 100644 --- a/src/gn/visual_studio_writer.h +++ b/src/gn/visual_studio_writer.h
@@ -113,18 +113,18 @@ const std::string& ninja_extra_args, const std::string& ninja_executable, Err* err); - bool WriteProjectFileContents(OutputStream& out, + bool WriteProjectFileContents(std::ostream& out, const SolutionProject& solution_project, const Target* target, const std::string& ninja_extra_args, const std::string& ninja_executable, SourceFileCompileTypePairs* source_types, Err* err); - void WriteFiltersFileContents(OutputStream& out, + void WriteFiltersFileContents(std::ostream& out, const Target* target, const SourceFileCompileTypePairs& source_types); bool WriteSolutionFile(const std::string& sln_name, Err* err); - void WriteSolutionFileContents(OutputStream& out, + void WriteSolutionFileContents(std::ostream& out, const base::FilePath& solution_dir_path); // Resolves all solution folders (parent folders for projects) into |folders_|
diff --git a/src/gn/visual_studio_writer_unittest.cc b/src/gn/visual_studio_writer_unittest.cc index b4abaed..01271a3 100644 --- a/src/gn/visual_studio_writer_unittest.cc +++ b/src/gn/visual_studio_writer_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "base/strings/string_util.h" -#include "gn/output_stream.h" #include "gn/test_with_scope.h" #include "gn/visual_studio_utils.h" #include "util/test/test.h" @@ -192,7 +191,7 @@ VisualStudioWriter::SourceFileCompileTypePairs source_types; - StringOutputStream file_contents; + std::stringstream file_contents; writer.WriteProjectFileContents(file_contents, *writer.projects_.back(), &target, "", "", &source_types, &err); @@ -227,7 +226,7 @@ VisualStudioWriter::SourceFileCompileTypePairs source_types; - StringOutputStream file_contents_without_flag; + std::stringstream file_contents_without_flag; writer.WriteProjectFileContents(file_contents_without_flag, *writer.projects_.back(), &target, "", "", &source_types, &err); @@ -236,7 +235,7 @@ ASSERT_NE(file_contents_without_flag.str().find("call ninja.exe"), std::string::npos); - StringOutputStream file_contents_with_flag; + std::stringstream file_contents_with_flag; writer.WriteProjectFileContents(file_contents_with_flag, *writer.projects_.back(), &target, "", "ninja_wrapper.exe", &source_types, &err);
diff --git a/src/gn/xcode_object.cc b/src/gn/xcode_object.cc index 58543ee..4399c55 100644 --- a/src/gn/xcode_object.cc +++ b/src/gn/xcode_object.cc
@@ -4,15 +4,15 @@ #include "gn/xcode_object.h" -#include <cstring> +#include <iomanip> #include <iterator> #include <memory> +#include <sstream> #include <utility> #include "base/logging.h" #include "base/strings/string_util.h" #include "gn/filesystem_utils.h" -#include "gn/output_stream.h" // Helper methods ------------------------------------------------------------- @@ -51,7 +51,7 @@ if (!StringNeedEscaping(string)) return string; - StringOutputStream buffer; + std::stringstream buffer; buffer << '"'; for (char c : string) { if (c <= 31) { @@ -75,12 +75,10 @@ case '\f': buffer << "\\f"; break; - default: { - char buff[10]; - ::snprintf(buff, sizeof(buff), "\\U%04x", static_cast<unsigned>(c)); - buffer << buff; + default: + buffer << std::hex << std::setw(4) << std::left << "\\U" + << static_cast<unsigned>(c); break; - } } } else { if (c == '"' || c == '\\') @@ -173,37 +171,37 @@ explicit NoReference(const PBXObject* value) : value(value) {} }; -void PrintValue(OutputStream& out, IndentRules rules, unsigned value) { +void PrintValue(std::ostream& out, IndentRules rules, unsigned value) { out << value; } -void PrintValue(OutputStream& out, IndentRules rules, const char* value) { +void PrintValue(std::ostream& out, IndentRules rules, const char* value) { out << EncodeString(value); } -void PrintValue(OutputStream& out, +void PrintValue(std::ostream& out, IndentRules rules, const std::string& value) { out << EncodeString(value); } -void PrintValue(OutputStream& out, IndentRules rules, const NoReference& obj) { +void PrintValue(std::ostream& out, IndentRules rules, const NoReference& obj) { out << obj.value->id(); } -void PrintValue(OutputStream& out, IndentRules rules, const PBXObject* value) { +void PrintValue(std::ostream& out, IndentRules rules, const PBXObject* value) { out << value->Reference(); } template <typename ObjectClass> -void PrintValue(OutputStream& out, +void PrintValue(std::ostream& out, IndentRules rules, const std::unique_ptr<ObjectClass>& value) { PrintValue(out, rules, value.get()); } template <typename ValueType> -void PrintValue(OutputStream& out, +void PrintValue(std::ostream& out, IndentRules rules, const std::vector<ValueType>& values) { IndentRules sub_rule{rules.one_line, rules.level + 1}; @@ -222,7 +220,7 @@ } template <typename ValueType> -void PrintValue(OutputStream& out, +void PrintValue(std::ostream& out, IndentRules rules, const std::map<std::string, ValueType>& values) { IndentRules sub_rule{rules.one_line, rules.level + 1}; @@ -242,7 +240,7 @@ } template <typename ValueType> -void PrintProperty(OutputStream& out, +void PrintProperty(std::ostream& out, IndentRules rules, const char* name, ValueType&& value) { @@ -445,7 +443,7 @@ return PBXAggregateTargetClass; } -void PBXAggregateTarget::Print(OutputStream& out, unsigned indent) const { +void PBXAggregateTarget::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -477,7 +475,7 @@ return file_reference_->Name() + " in " + build_phase_->Name(); } -void PBXBuildFile::Print(OutputStream& out, unsigned indent) const { +void PBXBuildFile::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {true, 0}; out << indent_str << Reference() << " = {"; @@ -501,7 +499,7 @@ return "PBXContainerItemProxy"; } -void PBXContainerItemProxy::Print(OutputStream& out, unsigned indent) const { +void PBXContainerItemProxy::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -534,7 +532,7 @@ return !name_.empty() ? name_ : path_; } -void PBXFileReference::Print(OutputStream& out, unsigned indent) const { +void PBXFileReference::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {true, 0}; out << indent_str << Reference() << " = {"; @@ -574,7 +572,7 @@ return "Frameworks"; } -void PBXFrameworksBuildPhase::Print(OutputStream& out, unsigned indent) const { +void PBXFrameworksBuildPhase::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -665,7 +663,7 @@ } } -void PBXGroup::Print(OutputStream& out, unsigned indent) const { +void PBXGroup::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -757,7 +755,7 @@ return PBXNativeTargetClass; } -void PBXNativeTarget::Print(OutputStream& out, unsigned indent) const { +void PBXNativeTarget::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -926,7 +924,7 @@ target->Visit(visitor); } } -void PBXProject::Print(OutputStream& out, unsigned indent) const { +void PBXProject::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -960,7 +958,7 @@ return "Resources"; } -void PBXResourcesBuildPhase::Print(OutputStream& out, unsigned indent) const { +void PBXResourcesBuildPhase::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -989,7 +987,7 @@ return name_; } -void PBXShellScriptBuildPhase::Print(OutputStream& out, unsigned indent) const { +void PBXShellScriptBuildPhase::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -1021,7 +1019,7 @@ return "Sources"; } -void PBXSourcesBuildPhase::Print(OutputStream& out, unsigned indent) const { +void PBXSourcesBuildPhase::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -1057,7 +1055,7 @@ container_item_proxy_->Visit(visitor); } -void PBXTargetDependency::Print(OutputStream& out, unsigned indent) const { +void PBXTargetDependency::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -1083,7 +1081,7 @@ return name_; } -void XCBuildConfiguration::Print(OutputStream& out, unsigned indent) const { +void XCBuildConfiguration::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n"; @@ -1135,7 +1133,7 @@ } } -void XCConfigurationList::Print(OutputStream& out, unsigned indent) const { +void XCConfigurationList::Print(std::ostream& out, unsigned indent) const { const std::string indent_str(indent, '\t'); const IndentRules rules = {false, indent + 1}; out << indent_str << Reference() << " = {\n";
diff --git a/src/gn/xcode_object.h b/src/gn/xcode_object.h index 8bad659..076e993 100644 --- a/src/gn/xcode_object.h +++ b/src/gn/xcode_object.h
@@ -45,7 +45,6 @@ // Forward-declarations ------------------------------------------------------- -class OutputStream; class PBXAggregateTarget; class PBXBuildFile; class PBXBuildPhase; @@ -109,7 +108,7 @@ virtual std::string Comment() const; virtual void Visit(PBXObjectVisitor& visitor); virtual void Visit(PBXObjectVisitorConst& visitor) const; - virtual void Print(OutputStream& out, unsigned indent) const = 0; + virtual void Print(std::ostream& out, unsigned indent) const = 0; private: std::string id_; @@ -181,7 +180,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXAggregateTarget(const PBXAggregateTarget&) = delete; @@ -199,7 +198,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: const PBXFileReference* file_reference_ = nullptr; @@ -218,7 +217,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: const PBXProject* project_ = nullptr; @@ -241,7 +240,7 @@ PBXObjectClass Class() const override; std::string Name() const override; std::string Comment() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; const std::string& path() const { return path_; } @@ -264,7 +263,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXFrameworksBuildPhase(const PBXFrameworksBuildPhase&) = delete; @@ -296,7 +295,7 @@ std::string Name() const override; void Visit(PBXObjectVisitor& visitor) override; void Visit(PBXObjectVisitorConst& visitor) const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; // Returns whether the current PBXGroup should sort last when sorting // children of a PBXGroup. This should only be used for the "Products" @@ -354,7 +353,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: const PBXFileReference* product_reference_ = nullptr; @@ -403,7 +402,7 @@ std::string Comment() const override; void Visit(PBXObjectVisitor& visitor) override; void Visit(PBXObjectVisitorConst& visitor) const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXAttributes attributes_; @@ -432,7 +431,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXResourcesBuildPhase(const PBXResourcesBuildPhase&) = delete; @@ -450,7 +449,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: std::string name_; @@ -470,7 +469,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXSourcesBuildPhase(const PBXSourcesBuildPhase&) = delete; @@ -490,7 +489,7 @@ std::string Name() const override; void Visit(PBXObjectVisitor& visitor) override; void Visit(PBXObjectVisitorConst& visitor) const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: const PBXTarget* target_ = nullptr; @@ -511,7 +510,7 @@ // PBXObject implementation. PBXObjectClass Class() const override; std::string Name() const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: PBXAttributes attributes_; @@ -535,7 +534,7 @@ std::string Name() const override; void Visit(PBXObjectVisitor& visitor) override; void Visit(PBXObjectVisitorConst& visitor) const override; - void Print(OutputStream& out, unsigned indent) const override; + void Print(std::ostream& out, unsigned indent) const override; private: std::vector<std::unique_ptr<XCBuildConfiguration>> configurations_;
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc index 85b6c08..ea84a3d 100644 --- a/src/gn/xcode_writer.cc +++ b/src/gn/xcode_writer.cc
@@ -9,6 +9,7 @@ #include <map> #include <memory> #include <optional> +#include <sstream> #include <string> #include <string_view> #include <utility> @@ -30,7 +31,6 @@ #include "gn/filesystem_utils.h" #include "gn/item.h" #include "gn/loader.h" -#include "gn/output_stream.h" #include "gn/scheduler.h" #include "gn/settings.h" #include "gn/source_file.h" @@ -551,7 +551,8 @@ if (source_file.is_null()) return false; - StringOutputBuffer out; + StringOutputBuffer storage; + std::ostream out(&storage); out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" << "<Workspace\n" << " version = \"1.0\">\n" @@ -560,8 +561,8 @@ << " </FileRef>\n" << "</Workspace>\n"; - return out.WriteToFileIfChanged(build_settings_->GetFullPath(source_file), - err); + return storage.WriteToFileIfChanged(build_settings_->GetFullPath(source_file), + err); } bool XcodeWorkspace::WriteSettingsFile(const std::string& name, @@ -573,7 +574,8 @@ if (source_file.is_null()) return false; - StringOutputBuffer out; + StringOutputBuffer storage; + std::ostream out(&storage); out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" " << "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" @@ -591,8 +593,8 @@ out << "</dict>\n" << "</plist>\n"; - return out.WriteToFileIfChanged(build_settings_->GetFullPath(source_file), - err); + return storage.WriteToFileIfChanged(build_settings_->GetFullPath(source_file), + err); } // Class responsible for constructing and writing the .xcodeproj from the @@ -658,7 +660,7 @@ std::string GetConfigOutputDir(std::string_view output_dir); // Generates the content of the .xcodeproj file into |out|. - void WriteFileContent(OutputStream& out) const; + void WriteFileContent(std::ostream& out) const; // Returns whether the file should be added to the project. bool ShouldIncludeFileInProject(const SourceFile& source) const; @@ -914,11 +916,12 @@ if (pbxproj_file.is_null()) return false; - StringOutputBuffer pbxproj_out; - WriteFileContent(pbxproj_out); + StringOutputBuffer storage; + std::ostream pbxproj_string_out(&storage); + WriteFileContent(pbxproj_string_out); - if (!pbxproj_out.WriteToFileIfChanged( - build_settings_->GetFullPath(pbxproj_file), err)) { + if (!storage.WriteToFileIfChanged(build_settings_->GetFullPath(pbxproj_file), + err)) { return false; } @@ -1059,7 +1062,7 @@ build_settings_->root_path_utf8()); } -void XcodeProject::WriteFileContent(OutputStream& out) const { +void XcodeProject::WriteFileContent(std::ostream& out) const { out << "// !$*UTF8*$!\n" << "{\n" << "\tarchiveVersion = 1;\n"
diff --git a/src/gn/xml_element_writer.cc b/src/gn/xml_element_writer.cc index 4ee5820..f888915 100644 --- a/src/gn/xml_element_writer.cc +++ b/src/gn/xml_element_writer.cc
@@ -19,12 +19,12 @@ return *this; } -XmlElementWriter::XmlElementWriter(OutputStream& out, +XmlElementWriter::XmlElementWriter(std::ostream& out, const std::string& tag, const XmlAttributes& attributes) : XmlElementWriter(out, tag, attributes, 0) {} -XmlElementWriter::XmlElementWriter(OutputStream& out, +XmlElementWriter::XmlElementWriter(std::ostream& out, const std::string& tag, const XmlAttributes& attributes, int indent) @@ -42,11 +42,11 @@ if (!opening_tag_finished_) { // The XML spec does not require a space before the closing slash. However, // Eclipse is unable to parse XML settings files if there is no space. - out_ << " />\n"; + out_ << " />" << std::endl; } else { if (!one_line_) out_ << std::string(indent_, ' '); - out_ << "</" << tag_ << ">\n"; + out_ << "</" << tag_ << '>' << std::endl; } } @@ -67,13 +67,13 @@ return std::make_unique<XmlElementWriter>(out_, tag, attributes, indent_ + 2); } -OutputStream& XmlElementWriter::StartContent(bool start_new_line) { +std::ostream& XmlElementWriter::StartContent(bool start_new_line) { if (!opening_tag_finished_) { out_ << '>'; opening_tag_finished_ = true; if (start_new_line && one_line_) { - out_ << "\n"; + out_ << std::endl; one_line_ = false; } }
diff --git a/src/gn/xml_element_writer.h b/src/gn/xml_element_writer.h index e23581f..1bf9b46 100644 --- a/src/gn/xml_element_writer.h +++ b/src/gn/xml_element_writer.h
@@ -12,8 +12,6 @@ #include <utility> #include <vector> -#include "gn/output_stream.h" - // Vector of XML attribute key-value pairs. class XmlAttributes : public std::vector<std::pair<std::string_view, std::string_view>> { @@ -31,11 +29,11 @@ public: // Starts new XML element. This constructor adds no indentation and is // designed for XML root element. - XmlElementWriter(OutputStream& out, + XmlElementWriter(std::ostream& out, const std::string& tag, const XmlAttributes& attributes); // Starts new XML element with specified indentation. - XmlElementWriter(OutputStream& out, + XmlElementWriter(std::ostream& out, const std::string& tag, const XmlAttributes& attributes, int indent); @@ -43,7 +41,7 @@ // that allows writing XML element with single attribute without copying // attribute value. template <class Writer> - XmlElementWriter(OutputStream& out, + XmlElementWriter(std::ostream& out, const std::string& tag, const std::string& attribute_name, const Writer& attribute_value_writer, @@ -68,12 +66,12 @@ // Finishes opening tag if it isn't finished yet and optionally starts new // document line. Returns the stream where XML element content can be written. // This is an alternative to Text() and SubElement() methods. - OutputStream& StartContent(bool start_new_line); + std::ostream& StartContent(bool start_new_line); private: // Output stream. XmlElementWriter objects for XML element and its // sub-elements share the same output stream. - OutputStream& out_; + std::ostream& out_; // XML element tag name. std::string tag_; @@ -92,7 +90,7 @@ }; template <class Writer> -XmlElementWriter::XmlElementWriter(OutputStream& out, +XmlElementWriter::XmlElementWriter(std::ostream& out, const std::string& tag, const std::string& attribute_name, const Writer& attribute_value_writer,
diff --git a/src/gn/xml_element_writer_unittest.cc b/src/gn/xml_element_writer_unittest.cc index 9ad9ed3..6a4cfed 100644 --- a/src/gn/xml_element_writer_unittest.cc +++ b/src/gn/xml_element_writer_unittest.cc
@@ -4,7 +4,8 @@ #include "gn/xml_element_writer.h" -#include "gn/output_stream.h" +#include <sstream> + #include "util/test/test.h" namespace { @@ -12,7 +13,7 @@ class MockValueWriter { public: explicit MockValueWriter(const std::string& value) : value_(value) {} - void operator()(OutputStream& out) const { out << value_; } + void operator()(std::ostream& out) const { out << value_; } private: std::string value_; @@ -21,24 +22,24 @@ } // namespace TEST(XmlElementWriter, EmptyElement) { - StringOutputStream out; + std::ostringstream out; { XmlElementWriter writer(out, "foo", XmlAttributes()); } EXPECT_EQ("<foo />\n", out.str()); - StringOutputStream out_attr; + std::ostringstream out_attr; { XmlElementWriter writer(out_attr, "foo", XmlAttributes("bar", "abc").add("baz", "123")); } EXPECT_EQ("<foo bar=\"abc\" baz=\"123\" />\n", out_attr.str()); - StringOutputStream out_indent; + std::ostringstream out_indent; { XmlElementWriter writer(out_indent, "foo", XmlAttributes("bar", "baz"), 2); } EXPECT_EQ(" <foo bar=\"baz\" />\n", out_indent.str()); - StringOutputStream out_writer; + std::ostringstream out_writer; { XmlElementWriter writer(out_writer, "foo", "bar", MockValueWriter("baz"), 2); @@ -47,7 +48,7 @@ } TEST(XmlElementWriter, ElementWithText) { - StringOutputStream out; + std::ostringstream out; { XmlElementWriter writer(out, "foo", XmlAttributes("bar", "baz")); writer.Text("Hello world!"); @@ -56,7 +57,7 @@ } TEST(XmlElementWriter, SubElements) { - StringOutputStream out; + std::ostringstream out; { XmlElementWriter writer(out, "root", XmlAttributes("aaa", "000")); writer.SubElement("foo", XmlAttributes()); @@ -76,7 +77,7 @@ } TEST(XmlElementWriter, StartContent) { - StringOutputStream out; + std::ostringstream out; { XmlElementWriter writer(out, "foo", XmlAttributes("bar", "baz")); writer.StartContent(false) << "Hello world!";