Skip to content

Commit c7a15e1

Browse files
committed
[Localization] Simplify localization producer interface
Require producers to implement `getMessage(DiagID)` and establish default implementation of `getMessageOr`, so producers don't have to worry about handling fallback if translation is unavailable.
1 parent c80477b commit c7a15e1

File tree

2 files changed

+20
-23
lines changed

2 files changed

+20
-23
lines changed

include/swift/Localization/LocalizationFormat.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,20 @@ class SerializedLocalizationWriter {
155155

156156
class LocalizationProducer {
157157
public:
158-
/// If the message isn't available/localized in the current `yaml` file,
158+
/// If the message isn't available/localized in current context
159159
/// return the fallback default message.
160160
virtual llvm::StringRef getMessageOr(swift::DiagID id,
161161
llvm::StringRef defaultMessage) const {
162-
return defaultMessage;
162+
auto message = getMessage(id);
163+
return message.empty() ? defaultMessage : message;
163164
}
164165

165166
virtual ~LocalizationProducer() {}
167+
168+
protected:
169+
/// Retrieve a message for the given diagnostic id.
170+
/// \returns empty string if message couldn't be found.
171+
virtual llvm::StringRef getMessage(swift::DiagID id) const = 0;
166172
};
167173

168174
class YAMLLocalizationProducer final : public LocalizationProducer {
@@ -172,14 +178,15 @@ class YAMLLocalizationProducer final : public LocalizationProducer {
172178
/// The diagnostics IDs that are no longer available in `.def`
173179
std::vector<std::string> unknownIDs;
174180
explicit YAMLLocalizationProducer(llvm::StringRef filePath);
175-
llvm::StringRef getMessageOr(swift::DiagID id,
176-
llvm::StringRef defaultMessage) const override;
177181

178182
/// Iterate over all of the available (non-empty) translations
179183
/// maintained by this producer, callback gets each translation
180184
/// with its unique identifier.
181185
void forEachAvailable(
182186
llvm::function_ref<void(swift::DiagID, llvm::StringRef)> callback) const;
187+
188+
protected:
189+
llvm::StringRef getMessage(swift::DiagID id) const override;
183190
};
184191

185192
class SerializedLocalizationProducer final : public LocalizationProducer {
@@ -193,8 +200,8 @@ class SerializedLocalizationProducer final : public LocalizationProducer {
193200
explicit SerializedLocalizationProducer(
194201
std::unique_ptr<llvm::MemoryBuffer> buffer);
195202

196-
llvm::StringRef getMessageOr(swift::DiagID id,
197-
llvm::StringRef defaultMessage) const override;
203+
protected:
204+
llvm::StringRef getMessage(swift::DiagID id) const override;
198205
};
199206

200207
class LocalizationInput : public llvm::yaml::Input {

lib/Localization/LocalizationFormat.cpp

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,12 @@ SerializedLocalizationProducer::SerializedLocalizationProducer(
9595
base + tableOffset, base + sizeof(offset_type), base));
9696
}
9797

98-
llvm::StringRef SerializedLocalizationProducer::getMessageOr(
99-
swift::DiagID id, llvm::StringRef defaultMessage) const {
98+
llvm::StringRef
99+
SerializedLocalizationProducer::getMessage(swift::DiagID id) const {
100100
auto value = SerializedTable.get()->find(id);
101-
llvm::StringRef diagnosticMessage((const char *)value.getDataPtr(),
102-
value.getDataLen());
103-
if (diagnosticMessage.empty())
104-
return defaultMessage;
105-
106-
return diagnosticMessage;
101+
if (value.getDataLen() == 0)
102+
return llvm::StringRef();
103+
return {(const char *)value.getDataPtr(), value.getDataLen()};
107104
}
108105

109106
YAMLLocalizationProducer::YAMLLocalizationProducer(llvm::StringRef filePath) {
@@ -114,15 +111,8 @@ YAMLLocalizationProducer::YAMLLocalizationProducer(llvm::StringRef filePath) {
114111
unknownIDs = std::move(yin.unknownIDs);
115112
}
116113

117-
llvm::StringRef
118-
YAMLLocalizationProducer::getMessageOr(swift::DiagID id,
119-
llvm::StringRef defaultMessage) const {
120-
if (diagnostics.empty())
121-
return defaultMessage;
122-
const std::string &diagnosticMessage = diagnostics[(unsigned)id];
123-
if (diagnosticMessage.empty())
124-
return defaultMessage;
125-
return diagnosticMessage;
114+
llvm::StringRef YAMLLocalizationProducer::getMessage(swift::DiagID id) const {
115+
return diagnostics[(unsigned)id];
126116
}
127117

128118
void YAMLLocalizationProducer::forEachAvailable(

0 commit comments

Comments
 (0)