Skip to content

Commit 9a9f796

Browse files
authored
Merge pull request #41844 from artemcm/TargetInfoCarefulJSON
Do not escape UNICODE when writing out target info.
2 parents ce75256 + 57518b5 commit 9a9f796

File tree

8 files changed

+50
-39
lines changed

8 files changed

+50
-39
lines changed

include/swift/Basic/StringExtras.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,10 @@ class NullTerminatedStringRef {
515515
int compare(NullTerminatedStringRef RHS) const { return Ref.compare(RHS); }
516516
};
517517

518+
/// A variant of write_escaped that does not escape Unicode characters - useful for generating JSON,
519+
/// where escaped Unicode characters lead to malformed/invalid JSON.
520+
void writeEscaped(llvm::StringRef Str, llvm::raw_ostream &OS);
521+
518522
} // end namespace swift
519523

520524
#endif // SWIFT_BASIC_STRINGEXTRAS_H

lib/Basic/StringExtras.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "llvm/ADT/SmallVector.h"
2424
#include "llvm/ADT/StringSwitch.h"
2525
#include "llvm/Support/Compiler.h"
26+
#include "llvm/Support/raw_ostream.h"
2627
#include <algorithm>
2728

2829
using namespace swift;
@@ -1392,3 +1393,27 @@ Optional<StringRef> swift::stripWithCompletionHandlerSuffix(StringRef name) {
13921393

13931394
return None;
13941395
}
1396+
1397+
void swift::writeEscaped(llvm::StringRef Str, llvm::raw_ostream &OS) {
1398+
for (unsigned i = 0, e = Str.size(); i != e; ++i) {
1399+
unsigned char c = Str[i];
1400+
1401+
switch (c) {
1402+
case '\\':
1403+
OS << '\\' << '\\';
1404+
break;
1405+
case '\t':
1406+
OS << '\\' << 't';
1407+
break;
1408+
case '\n':
1409+
OS << '\\' << 'n';
1410+
break;
1411+
case '"':
1412+
OS << '\\' << '"';
1413+
break;
1414+
default:
1415+
OS << c;
1416+
break;
1417+
}
1418+
}
1419+
}

lib/Basic/TargetInfo.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "swift/Basic/TargetInfo.h"
1414
#include "swift/Basic/Version.h"
1515
#include "swift/Basic/Platform.h"
16+
#include "swift/Basic/StringExtras.h"
1617
#include "swift/Frontend/Frontend.h"
1718

1819
#include "llvm/Support/raw_ostream.h"
@@ -35,11 +36,11 @@ static void printCompatibilityLibrary(
3536
out << " {\n";
3637

3738
out << " \"libraryName\": \"";
38-
out.write_escaped(libraryName);
39+
swift::writeEscaped(libraryName, out);
3940
out << "\",\n";
4041

4142
out << " \"filter\": \"";
42-
out.write_escaped(filter);
43+
swift::writeEscaped(filter, out);
4344
out << "\"\n";
4445
out << " }";
4546

@@ -53,8 +54,7 @@ void targetinfo::printTargetInfo(const CompilerInvocation &invocation,
5354

5455
// Compiler version, as produced by --version.
5556
out << " \"compilerVersion\": \"";
56-
out.write_escaped(version::getSwiftFullVersion(
57-
version::Version::getCurrentLanguageVersion()));
57+
writeEscaped(version::getSwiftFullVersion(version::Version::getCurrentLanguageVersion()), out);
5858
out << "\",\n";
5959

6060
// Target triple and target variant triple.
@@ -77,15 +77,15 @@ void targetinfo::printTargetInfo(const CompilerInvocation &invocation,
7777

7878
if (!searchOpts.getSDKPath().empty()) {
7979
out << " \"sdkPath\": \"";
80-
out.write_escaped(searchOpts.getSDKPath());
80+
writeEscaped(searchOpts.getSDKPath(), out);
8181
out << "\",\n";
8282
}
8383

8484
auto outputPaths = [&](StringRef name, const std::vector<std::string> &paths){
8585
out << " \"" << name << "\": [\n";
8686
llvm::interleave(paths, [&out](const std::string &path) {
8787
out << " \"";
88-
out.write_escaped(path);
88+
writeEscaped(path, out);
8989
out << "\"";
9090
}, [&out] {
9191
out << ",\n";
@@ -98,7 +98,7 @@ void targetinfo::printTargetInfo(const CompilerInvocation &invocation,
9898
searchOpts.getRuntimeLibraryImportPaths());
9999

100100
out << " \"runtimeResourcePath\": \"";
101-
out.write_escaped(searchOpts.RuntimeResourcePath);
101+
writeEscaped(searchOpts.RuntimeResourcePath, out);
102102
out << "\"\n";
103103

104104
out << " }\n";
@@ -113,20 +113,20 @@ void targetinfo::printTripleInfo(const llvm::Triple &triple,
113113
out << "{\n";
114114

115115
out << " \"triple\": \"";
116-
out.write_escaped(triple.getTriple());
116+
writeEscaped(triple.getTriple(), out);
117117
out << "\",\n";
118118

119119
out << " \"unversionedTriple\": \"";
120-
out.write_escaped(getUnversionedTriple(triple).getTriple());
120+
writeEscaped(getUnversionedTriple(triple).getTriple(), out);
121121
out << "\",\n";
122122

123123
out << " \"moduleTriple\": \"";
124-
out.write_escaped(getTargetSpecificModuleTriple(triple).getTriple());
124+
writeEscaped(getTargetSpecificModuleTriple(triple).getTriple(), out);
125125
out << "\",\n";
126126

127127
if (runtimeVersion) {
128128
out << " \"swiftRuntimeCompatibilityVersion\": \"";
129-
out.write_escaped(runtimeVersion->getAsString());
129+
writeEscaped(runtimeVersion->getAsString(), out);
130130
out << "\",\n";
131131

132132
// Compatibility libraries that need to be linked.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: %target-swift-frontend -print-target-info -target arm64-apple-ios12.0 -sdk /Applications🙉/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk | %FileCheck %s
2+
3+
// CHECK: "target": {
4+
// CHECK-NEXT: "triple": "arm64-apple-ios12.0",
5+
// CHECK: "sdkPath": "/Applications🙉/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk",

tools/SourceKit/tools/sourcekitd/include/sourcekitd/Internal.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,6 @@ sourcekitd_response_t createErrorRequestCancelled();
194194
sourcekitd_uid_t SKDUIDFromUIdent(SourceKit::UIdent UID);
195195
SourceKit::UIdent UIdentFromSKDUID(sourcekitd_uid_t uid);
196196

197-
void writeEscaped(llvm::StringRef Str, llvm::raw_ostream &OS);
198-
199197
static inline sourcekitd_variant_t makeNullVariant() {
200198
return {{ 0, 0, 0 }};
201199
}

tools/SourceKit/tools/sourcekitd/include/sourcekitd/RequestResponsePrinterBase.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "sourcekitd/sourcekitd.h"
1717
#include "sourcekitd/Logging.h"
18+
#include "swift/Basic/StringExtras.h"
1819
#include <vector>
1920

2021
namespace llvm {
@@ -92,7 +93,7 @@ class RequestResponsePrinterBase {
9293
OS << '\"';
9394
// Avoid raw_ostream's write_escaped, we don't want to escape unicode
9495
// characters because it will be invalid JSON.
95-
writeEscaped(Str, OS);
96+
swift::writeEscaped(Str, OS);
9697
OS << '\"';
9798
}
9899

tools/SourceKit/tools/sourcekitd/lib/API/sourcekitdAPI-Common.cpp

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "sourcekitd/RequestResponsePrinterBase.h"
1717
#include "SourceKit/Support/Logging.h"
1818
#include "SourceKit/Support/UIdent.h"
19+
#include "swift/Basic/StringExtras.h"
1920
#include "llvm/ADT/ArrayRef.h"
2021
#include "llvm/ADT/SmallString.h"
2122
#include "llvm/Support/ErrorHandling.h"
@@ -133,30 +134,6 @@ class VariantPrinter : public VariantVisitor<VariantPrinter>,
133134
};
134135
} // end anonymous namespace
135136

136-
void sourcekitd::writeEscaped(llvm::StringRef Str, llvm::raw_ostream &OS) {
137-
for (unsigned i = 0, e = Str.size(); i != e; ++i) {
138-
unsigned char c = Str[i];
139-
140-
switch (c) {
141-
case '\\':
142-
OS << '\\' << '\\';
143-
break;
144-
case '\t':
145-
OS << '\\' << 't';
146-
break;
147-
case '\n':
148-
OS << '\\' << 'n';
149-
break;
150-
case '"':
151-
OS << '\\' << '"';
152-
break;
153-
default:
154-
OS << c;
155-
break;
156-
}
157-
}
158-
}
159-
160137
static void printError(sourcekitd_response_t Err, raw_ostream &OS) {
161138
OS << "error response (";
162139
switch (sourcekitd_response_error_get_kind(Err)) {

tools/SourceKit/tools/sourcekitd/lib/API/sourcekitdAPI-InProc.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "SourceKit/Core/LLVM.h"
2424
#include "SourceKit/Support/UIdent.h"
2525
#include "swift/Basic/ThreadSafeRefCounted.h"
26+
#include "swift/Basic/StringExtras.h"
2627
#include "llvm/ADT/ArrayRef.h"
2728
#include "llvm/ADT/StringRef.h"
2829
#include "llvm/ADT/IntrusiveRefCntPtr.h"
@@ -405,7 +406,7 @@ class SKDObjectPrinter : public SKDObjectVisitor<SKDObjectPrinter> {
405406
OS << '\"';
406407
// Avoid raw_ostream's write_escaped, we don't want to escape unicode
407408
// characters because it will be invalid JSON.
408-
writeEscaped(Str, OS);
409+
swift::writeEscaped(Str, OS);
409410
OS << '\"';
410411
}
411412

0 commit comments

Comments
 (0)