OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/eclipse_writer.h" | 5 #include "tools/gn/eclipse_writer.h" |
6 | 6 |
7 #include <fstream> | 7 #include <fstream> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 result += "&"; | 29 result += "&"; |
30 else | 30 else |
31 result.push_back(c); | 31 result.push_back(c); |
32 } | 32 } |
33 return result; | 33 return result; |
34 } | 34 } |
35 | 35 |
36 } // namespace | 36 } // namespace |
37 | 37 |
38 EclipseWriter::EclipseWriter(const BuildSettings* build_settings, | 38 EclipseWriter::EclipseWriter(const BuildSettings* build_settings, |
39 const Builder* builder, | 39 const Builder& builder, |
40 std::ostream& out) | 40 std::ostream& out) |
41 : build_settings_(build_settings), builder_(builder), out_(out) { | 41 : build_settings_(build_settings), builder_(builder), out_(out) { |
42 languages_.push_back("C++ Source File"); | 42 languages_.push_back("C++ Source File"); |
43 languages_.push_back("C Source File"); | 43 languages_.push_back("C Source File"); |
44 languages_.push_back("Assembly Source File"); | 44 languages_.push_back("Assembly Source File"); |
45 languages_.push_back("GNU C++"); | 45 languages_.push_back("GNU C++"); |
46 languages_.push_back("GNU C"); | 46 languages_.push_back("GNU C"); |
47 languages_.push_back("Assembly"); | 47 languages_.push_back("Assembly"); |
48 } | 48 } |
49 | 49 |
50 EclipseWriter::~EclipseWriter() {} | 50 EclipseWriter::~EclipseWriter() {} |
51 | 51 |
52 // static | 52 // static |
53 bool EclipseWriter::RunAndWriteFile( | 53 bool EclipseWriter::RunAndWriteFile( |
54 const BuildSettings* build_settings, | 54 const BuildSettings* build_settings, |
55 const Builder* builder, | 55 const Builder& builder, |
56 Err* err) { | 56 Err* err) { |
57 base::FilePath file = build_settings->GetFullPath(build_settings->build_dir()) | 57 base::FilePath file = build_settings->GetFullPath(build_settings->build_dir()) |
58 .AppendASCII("eclipse-cdt-settings.xml"); | 58 .AppendASCII("eclipse-cdt-settings.xml"); |
59 std::ofstream file_out; | 59 std::ofstream file_out; |
60 file_out.open(FilePathToUTF8(file).c_str(), | 60 file_out.open(FilePathToUTF8(file).c_str(), |
61 std::ios_base::out | std::ios_base::binary); | 61 std::ios_base::out | std::ios_base::binary); |
62 if (file_out.fail()) { | 62 if (file_out.fail()) { |
63 *err = | 63 *err = |
64 Err(Location(), "Couldn't open eclipse-cdt-settings.xml for writing"); | 64 Err(Location(), "Couldn't open eclipse-cdt-settings.xml for writing"); |
65 return false; | 65 return false; |
66 } | 66 } |
67 | 67 |
68 EclipseWriter gen(build_settings, builder, file_out); | 68 EclipseWriter gen(build_settings, builder, file_out); |
69 gen.Run(); | 69 gen.Run(); |
70 return true; | 70 return true; |
71 } | 71 } |
72 | 72 |
73 void EclipseWriter::Run() { | 73 void EclipseWriter::Run() { |
74 GetAllIncludeDirs(); | 74 GetAllIncludeDirs(); |
75 GetAllDefines(); | 75 GetAllDefines(); |
76 WriteCDTSettings(); | 76 WriteCDTSettings(); |
77 } | 77 } |
78 | 78 |
79 void EclipseWriter::GetAllIncludeDirs() { | 79 void EclipseWriter::GetAllIncludeDirs() { |
80 std::vector<const Target*> targets = builder_->GetAllResolvedTargets(); | 80 std::vector<const Target*> targets = builder_.GetAllResolvedTargets(); |
81 for (const Target* target : targets) { | 81 for (const Target* target : targets) { |
82 if (!UsesDefaultToolchain(target)) | 82 if (!UsesDefaultToolchain(target)) |
83 continue; | 83 continue; |
84 | 84 |
85 for (ConfigValuesIterator it(target); !it.done(); it.Next()) { | 85 for (ConfigValuesIterator it(target); !it.done(); it.Next()) { |
86 for (const SourceDir& include_dir : it.cur().include_dirs()) { | 86 for (const SourceDir& include_dir : it.cur().include_dirs()) { |
87 include_dirs_.insert( | 87 include_dirs_.insert( |
88 FilePathToUTF8(build_settings_->GetFullPath(include_dir))); | 88 FilePathToUTF8(build_settings_->GetFullPath(include_dir))); |
89 } | 89 } |
90 } | 90 } |
91 } | 91 } |
92 } | 92 } |
93 | 93 |
94 void EclipseWriter::GetAllDefines() { | 94 void EclipseWriter::GetAllDefines() { |
95 std::vector<const Target*> targets = builder_->GetAllResolvedTargets(); | 95 std::vector<const Target*> targets = builder_.GetAllResolvedTargets(); |
96 for (const Target* target : targets) { | 96 for (const Target* target : targets) { |
97 if (!UsesDefaultToolchain(target)) | 97 if (!UsesDefaultToolchain(target)) |
98 continue; | 98 continue; |
99 | 99 |
100 for (ConfigValuesIterator it(target); !it.done(); it.Next()) { | 100 for (ConfigValuesIterator it(target); !it.done(); it.Next()) { |
101 for (const std::string& define : it.cur().defines()) { | 101 for (const std::string& define : it.cur().defines()) { |
102 size_t equal_pos = define.find('='); | 102 size_t equal_pos = define.find('='); |
103 std::string define_key; | 103 std::string define_key; |
104 std::string define_value; | 104 std::string define_value; |
105 if (equal_pos == std::string::npos) { | 105 if (equal_pos == std::string::npos) { |
106 define_key = define; | 106 define_key = define; |
107 } else { | 107 } else { |
108 define_key = define.substr(0, equal_pos); | 108 define_key = define.substr(0, equal_pos); |
109 define_value = define.substr(equal_pos + 1); | 109 define_value = define.substr(equal_pos + 1); |
110 } | 110 } |
111 defines_[define_key] = define_value; | 111 defines_[define_key] = define_value; |
112 } | 112 } |
113 } | 113 } |
114 } | 114 } |
115 } | 115 } |
116 | 116 |
117 bool EclipseWriter::UsesDefaultToolchain(const Target* target) const { | 117 bool EclipseWriter::UsesDefaultToolchain(const Target* target) const { |
118 return target->toolchain()->label() == | 118 return target->toolchain()->label() == |
119 builder_->loader()->GetDefaultToolchain(); | 119 builder_.loader()->GetDefaultToolchain(); |
120 } | 120 } |
121 | 121 |
122 void EclipseWriter::WriteCDTSettings() { | 122 void EclipseWriter::WriteCDTSettings() { |
123 out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; | 123 out_ << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; |
124 XmlElementWriter cdt_properties_element(out_, "cdtprojectproperties", | 124 XmlElementWriter cdt_properties_element(out_, "cdtprojectproperties", |
125 XmlAttributes()); | 125 XmlAttributes()); |
126 | 126 |
127 { | 127 { |
128 const char* kIncludesSectionName = | 128 const char* kIncludesSectionName = |
129 "org.eclipse.cdt.internal.ui.wizards.settingswizards.IncludePaths"; | 129 "org.eclipse.cdt.internal.ui.wizards.settingswizards.IncludePaths"; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 XmlAttributes("name", language)); | 163 XmlAttributes("name", language)); |
164 for (const auto& key_val : defines_) { | 164 for (const auto& key_val : defines_) { |
165 std::unique_ptr<XmlElementWriter> macro_element = | 165 std::unique_ptr<XmlElementWriter> macro_element = |
166 language_element->SubElement("macro"); | 166 language_element->SubElement("macro"); |
167 macro_element->SubElement("name")->Text(EscapeForXML(key_val.first)); | 167 macro_element->SubElement("name")->Text(EscapeForXML(key_val.first)); |
168 macro_element->SubElement("value")->Text(EscapeForXML(key_val.second)); | 168 macro_element->SubElement("value")->Text(EscapeForXML(key_val.second)); |
169 } | 169 } |
170 } | 170 } |
171 } | 171 } |
172 } | 172 } |
OLD | NEW |