Skip to content

Commit 8ee4e93

Browse files
committed
[Localization] Simplify implementation of iterator over YAML
1 parent a84cf7f commit 8ee4e93

File tree

3 files changed

+21
-33
lines changed

3 files changed

+21
-33
lines changed

include/swift/AST/LocalizationFormat.h

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef SWIFT_LOCALIZATIONFORMAT_H
1818
#define SWIFT_LOCALIZATIONFORMAT_H
1919

20+
#include "llvm/ADT/STLExtras.h"
2021
#include "llvm/ADT/StringRef.h"
2122
#include "llvm/Bitstream/BitstreamReader.h"
2223
#include "llvm/Support/DJB.h"
@@ -139,42 +140,18 @@ class LocalizationProducer {
139140
};
140141

141142
class YAMLLocalizationProducer final : public LocalizationProducer {
142-
// Type of the `diagnostics` vector.
143-
using T = std::vector<std::string>;
144-
struct Node {
145-
uint32_t id;
146-
typename T::value_type &msg;
147-
};
148-
typedef Node value_type;
149-
150-
class iterator {
151-
typename T::iterator it;
152-
uint32_t counter;
153-
154-
public:
155-
iterator(T::iterator _it, uint32_t counter = 0)
156-
: it(_it), counter(counter) {}
157-
158-
iterator operator++() { return iterator(++it, ++counter); }
159-
160-
bool operator!=(iterator other) { return it != other.it; }
161-
162-
typename T::iterator::value_type node() { return *it; }
163-
164-
value_type operator*() { return value_type{counter, *it}; }
165-
166-
uint32_t index() { return counter; }
167-
};
143+
std::vector<std::string> diagnostics;
168144

169145
public:
170-
std::vector<std::string> diagnostics;
171146
explicit YAMLLocalizationProducer(llvm::StringRef filePath);
172147
llvm::StringRef getMessageOr(swift::DiagID id,
173148
llvm::StringRef defaultMessage) const override;
174149

175-
iterator begin() { return iterator(diagnostics.begin()); }
176-
177-
iterator end() { return iterator(diagnostics.end()); }
150+
/// Iterate over all of the available (non-empty) translations
151+
/// maintained by this producer, callback gets each translation
152+
/// with its unique identifier.
153+
void forEachAvailable(
154+
llvm::function_ref<void(uint32_t, llvm::StringRef)> callback) const;
178155
};
179156

180157
class SerializedLocalizationProducer final : public LocalizationProducer {

lib/AST/LocalizationFormat.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ llvm::StringRef SerializedLocalizationProducer::getMessageOr(
114114
value.getDataLen());
115115
if (diagnosticMessage.empty())
116116
return defaultMessage;
117+
117118
return diagnosticMessage;
118119
}
119120

@@ -135,6 +136,15 @@ YAMLLocalizationProducer::getMessageOr(swift::DiagID id,
135136
return diagnosticMessage;
136137
}
137138

139+
void YAMLLocalizationProducer::forEachAvailable(
140+
llvm::function_ref<void(uint32_t, llvm::StringRef)> callback) const {
141+
for (uint32_t i = 0, n = diagnostics.size(); i != n; ++i) {
142+
auto translation = diagnostics[i];
143+
if (!translation.empty())
144+
callback(i, translation);
145+
}
146+
}
147+
138148
template <typename T, typename Context>
139149
typename std::enable_if<llvm::yaml::has_SequenceTraits<T>::value, void>::type
140150
readYAML(llvm::yaml::IO &io, T &Seq, bool, Context &Ctx) {

tools/swift-serialize-diagnostics/swift-serialize-diagnostics.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ int main(int argc, char *argv[]) {
7070
llvm::sys::path::replace_extension(SerializedFilePath, ".db");
7171

7272
SerializedLocalizationWriter Serializer;
73-
for (const auto translation : yaml) {
74-
Serializer.insert(diagnosticID[translation.id], translation.msg);
75-
}
73+
yaml.forEachAvailable(
74+
[&Serializer](uint32_t id, llvm::StringRef translation) {
75+
Serializer.insert(diagnosticID[id], translation);
76+
});
7677

7778
if (Serializer.emit(SerializedFilePath.str())) {
7879
llvm::errs() << "Cannot serialize diagnostic file "

0 commit comments

Comments
 (0)