diff options
author | Jean-Marie Henaff <jmhenaff@google.com> | 2015-04-30 18:01:02 +0200 |
---|---|---|
committer | Jean-Marie Henaff <jmhenaff@google.com> | 2015-04-30 18:28:37 +0200 |
commit | 23593657b594a6435cba44f327ab36153e7f0c99 (patch) | |
tree | cd1062601635024740573ad7c98da63aa3992761 /jack/src | |
parent | 44b438e852632417b0b96845a4903503a0c7eded (diff) | |
download | toolchain_jack-23593657b594a6435cba44f327ab36153e7f0c99.tar.gz toolchain_jack-23593657b594a6435cba44f327ab36153e7f0c99.tar.bz2 toolchain_jack-23593657b594a6435cba44f327ab36153e7f0c99.zip |
Make Strings comply to Json specifications in SdkReporter
http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Bug: 20320225
Change-Id: I57d86f622c02f8a36df212c29869fac1583cc032
Diffstat (limited to 'jack/src')
-rw-r--r-- | jack/src/com/android/jack/reporting/SdkReporter.java | 54 |
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 895da47f..d3bd90b3 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(); + } + } |