summaryrefslogtreecommitdiffstats
path: root/jack/src
diff options
context:
space:
mode:
authorJean-Philippe Lesot <jplesot@google.com>2015-05-04 08:45:43 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-05-04 08:45:44 +0000
commitc411d9966a69e334de6e7a3594c0f9197cfc9cb3 (patch)
tree76a7111b5ac2768c425826dffeece447f1bc06d1 /jack/src
parente71545e4d6c5112979c7978154d3ef0284abd230 (diff)
parent23593657b594a6435cba44f327ab36153e7f0c99 (diff)
downloadtoolchain_jack-c411d9966a69e334de6e7a3594c0f9197cfc9cb3.zip
toolchain_jack-c411d9966a69e334de6e7a3594c0f9197cfc9cb3.tar.gz
toolchain_jack-c411d9966a69e334de6e7a3594c0f9197cfc9cb3.tar.bz2
Merge "Make Strings comply to Json specifications in SdkReporter" into ub-jack
Diffstat (limited to 'jack/src')
-rw-r--r--jack/src/com/android/jack/reporting/SdkReporter.java54
1 files changed, 52 insertions, 2 deletions
diff --git a/jack/src/com/android/jack/reporting/SdkReporter.java b/jack/src/com/android/jack/reporting/SdkReporter.java
index 895da47..d3bd90b 100644
--- a/jack/src/com/android/jack/reporting/SdkReporter.java
+++ b/jack/src/com/android/jack/reporting/SdkReporter.java
@@ -16,6 +16,8 @@
package com.android.jack.reporting;
+import com.google.common.base.Strings;
+
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.reporting.Reportable.ProblemLevel;
import com.android.sched.util.codec.ImplementationName;
@@ -35,16 +37,19 @@ public class SdkReporter extends CommonReporter {
@Override
protected void printFilteredProblem(@Nonnull ProblemLevel problemLevel,
@Nonnull String message, @Nonnull SourceInfo sourceInfo) {
+ String escapedMessage = convertString(message);
+
StringBuffer messageBuffer = new StringBuffer("MESSAGE:{");
messageBuffer.append("\"kind\":\"").append(convertLevelName(problemLevel)).append("\",");
- messageBuffer.append("\"text\":\"").append(message).append("\",");
+ messageBuffer.append("\"text\":\"").append(escapedMessage).append("\",");
messageBuffer.append("\"sources\":[{");
if (sourceInfo != SourceInfo.UNKNOWN) {
String fileName = new File(sourceInfo.getFileName()).getAbsolutePath();
+ String escapedFileName = convertString(fileName);
- messageBuffer.append("\"file\":\"").append(fileName).append("\",");
+ messageBuffer.append("\"file\":\"").append(escapedFileName).append("\",");
messageBuffer.append("\"position\":{");
// Convert unknown values to match sdk expectations
@@ -90,4 +95,49 @@ public class SdkReporter extends CommonReporter {
}
}
+ // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
+ @Nonnull
+ private static String convertString(@Nonnull String s) {
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ switch (c) {
+ case '"':
+ buffer.append("\\\"");
+ break;
+ case '\\':
+ buffer.append("\\\\");
+ break;
+ case '/':
+ buffer.append("\\/");
+ break;
+ case '\b':
+ buffer.append("\\b");
+ break;
+ case '\f':
+ buffer.append("\\f");
+ break;
+ case '\n':
+ buffer.append("\\n");
+ break;
+ case '\r':
+ buffer.append("\\r");
+ break;
+ case '\t':
+ buffer.append("\\t");
+ break;
+ default:
+ if (Character.isISOControl(c)) {
+ buffer.append("\\u");
+ String cAsHex = Integer.toHexString(c);
+ buffer.append(Strings.repeat("0", 4 - cAsHex.length()));
+ buffer.append(cAsHex.toUpperCase());
+ } else {
+ buffer.append(c);
+ }
+ }
+ }
+ return buffer.toString();
+ }
+
}