Skip to content

Commit 1b0e8f9

Browse files
[Localization] Make localization producer handle printing diagnostics IDs
1 parent dc5a4bd commit 1b0e8f9

File tree

5 files changed

+44
-27
lines changed

5 files changed

+44
-27
lines changed

include/swift/AST/DiagnosticEngine.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -804,15 +804,15 @@ namespace swift {
804804
if (llvm::sys::fs::exists(filePath)) {
805805
if (auto file = llvm::MemoryBuffer::getFile(filePath)) {
806806
localization = std::make_unique<diag::SerializedLocalizationProducer>(
807-
std::move(file.get()));
807+
std::move(file.get()), getPrintDiagnosticNames());
808808
}
809809
} else {
810810
llvm::sys::path::replace_extension(filePath, ".yaml");
811811
// In case of missing localization files, we should fallback to messages
812812
// from `.def` files.
813813
if (llvm::sys::fs::exists(filePath)) {
814-
localization =
815-
std::make_unique<diag::YAMLLocalizationProducer>(filePath.str());
814+
localization = std::make_unique<diag::YAMLLocalizationProducer>(
815+
filePath.str(), getPrintDiagnosticNames());
816816
}
817817
}
818818
}

include/swift/Localization/LocalizationFormat.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,16 @@ class SerializedLocalizationWriter {
154154
};
155155

156156
class LocalizationProducer {
157+
bool printDiagnosticName;
158+
157159
public:
160+
LocalizationProducer(bool printDiagnosticName = false)
161+
: printDiagnosticName(printDiagnosticName) {}
162+
158163
/// If the message isn't available/localized in current context
159164
/// return the fallback default message.
160165
virtual llvm::StringRef getMessageOr(swift::DiagID id,
161-
llvm::StringRef defaultMessage) const {
162-
auto message = getMessage(id);
163-
return message.empty() ? defaultMessage : message;
164-
}
166+
llvm::StringRef defaultMessage) const;
165167

166168
virtual ~LocalizationProducer() {}
167169

@@ -177,7 +179,8 @@ class YAMLLocalizationProducer final : public LocalizationProducer {
177179
public:
178180
/// The diagnostics IDs that are no longer available in `.def`
179181
std::vector<std::string> unknownIDs;
180-
explicit YAMLLocalizationProducer(llvm::StringRef filePath);
182+
explicit YAMLLocalizationProducer(llvm::StringRef filePath,
183+
bool printDiagnosticName = false);
181184

182185
/// Iterate over all of the available (non-empty) translations
183186
/// maintained by this producer, callback gets each translation
@@ -198,7 +201,8 @@ class SerializedLocalizationProducer final : public LocalizationProducer {
198201

199202
public:
200203
explicit SerializedLocalizationProducer(
201-
std::unique_ptr<llvm::MemoryBuffer> buffer);
204+
std::unique_ptr<llvm::MemoryBuffer> buffer,
205+
bool printDiagnosticName = false);
202206

203207
protected:
204208
llvm::StringRef getMessage(swift::DiagID id) const override;

lib/AST/DiagnosticEngine.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,25 +1114,14 @@ void DiagnosticEngine::emitDiagnostic(const Diagnostic &diagnostic) {
11141114
llvm::StringRef
11151115
DiagnosticEngine::diagnosticStringFor(const DiagID id,
11161116
bool printDiagnosticName) {
1117-
auto defaultMessage = diagnosticStrings[(unsigned)id];
1118-
auto diagnosticName = diagnosticNameStrings[(unsigned)id];
1117+
auto defaultMessage = printDiagnosticName
1118+
? debugDiagnosticStrings[(unsigned)id]
1119+
: diagnosticStrings[(unsigned)id];
11191120
if (localization) {
11201121
auto localizedMessage =
11211122
localization.get()->getMessageOr(id, defaultMessage);
1122-
if (printDiagnosticName) {
1123-
std::string debugDiagnosticString = localizedMessage.str().c_str();
1124-
debugDiagnosticString += diagnosticName;
1125-
const std::string &localizedDebugDiagnosticString = debugDiagnosticString;
1126-
return localizedDebugDiagnosticString;
1127-
}
11281123
return localizedMessage;
11291124
}
1130-
1131-
if (printDiagnosticName) {
1132-
const std::string &debugDiagnosticString =
1133-
std::string(defaultMessage) + diagnosticName;
1134-
return debugDiagnosticString;
1135-
}
11361125
return defaultMessage;
11371126
}
11381127

lib/Localization/LocalizationFormat.cpp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ enum LocalDiagID : uint32_t {
3737
NumDiags
3838
};
3939

40+
static constexpr const char *const diagnosticNameStrings[] = {
41+
#define ERROR(ID, Options, Text, Signature) " [" #ID "]",
42+
#define WARNING(ID, Options, Text, Signature) " [" #ID "]",
43+
#define NOTE(ID, Options, Text, Signature) " [" #ID "]",
44+
#define REMARK(ID, Options, Text, Signature) " [" #ID "]",
45+
#include "swift/AST/DiagnosticsAll.def"
46+
"<not a diagnostic>",
47+
};
48+
4049
} // namespace
4150

4251
namespace llvm {
@@ -85,9 +94,22 @@ bool SerializedLocalizationWriter::emit(llvm::StringRef filePath) {
8594
return OS.has_error();
8695
}
8796

97+
llvm::StringRef
98+
LocalizationProducer::getMessageOr(swift::DiagID id,
99+
llvm::StringRef defaultMessage) const {
100+
auto localizedMessage = getMessage(id);
101+
if (localizedMessage.empty())
102+
return defaultMessage;
103+
llvm::StringRef diagnosticName(diagnosticNameStrings[(unsigned)id]);
104+
const std::string &localizedDebugDiagnosticMessage =
105+
localizedMessage.str() + diagnosticName.str();
106+
return printDiagnosticName ? localizedDebugDiagnosticMessage
107+
: localizedMessage;
108+
}
109+
88110
SerializedLocalizationProducer::SerializedLocalizationProducer(
89-
std::unique_ptr<llvm::MemoryBuffer> buffer)
90-
: Buffer(std::move(buffer)) {
111+
std::unique_ptr<llvm::MemoryBuffer> buffer, bool printDiagnosticName)
112+
: LocalizationProducer(printDiagnosticName), Buffer(std::move(buffer)) {
91113
auto base =
92114
reinterpret_cast<const unsigned char *>(Buffer.get()->getBufferStart());
93115
auto tableOffset = endian::read<offset_type>(base, little);
@@ -103,7 +125,9 @@ SerializedLocalizationProducer::getMessage(swift::DiagID id) const {
103125
return {(const char *)value.getDataPtr(), value.getDataLen()};
104126
}
105127

106-
YAMLLocalizationProducer::YAMLLocalizationProducer(llvm::StringRef filePath) {
128+
YAMLLocalizationProducer::YAMLLocalizationProducer(llvm::StringRef filePath,
129+
bool printDiagnosticName)
130+
: LocalizationProducer(printDiagnosticName) {
107131
auto FileBufOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filePath);
108132
llvm::MemoryBuffer *document = FileBufOrErr->get();
109133
diag::LocalizationInput yin(document->getBuffer());

test/diagnostics/Localization/en_localization.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ var self1 = self1
99
struct Broken {
1010
var b : Bool = True // expected-error{{cannot find 'True' in scope}}
1111
}
12-
var v1 : Int[1 // expected-error {{expected ']' in array type}} expected-note {{to match this opening '['}}
12+
// CHECK_NAMES: error: cannot find 'True' in scope [cannot_find_in_scope]{{$}}

0 commit comments

Comments
 (0)