From 125b839889420801a26bacd99251d53cad266539 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 2 Oct 2019 19:03:34 +0200 Subject: [PATCH] ProtoLog: Better behavior when parsing fails Improves behavior when parsing fails; now, ProtoLog skips the offending files, and relies on the subsequent compilation step to catch the error. Additionally, the build no longer fails when the canonical protolog.json file contains obsolete entries. Test: Introduce syntax error in services/core/ file, make and verify error messaging is sound Change-Id: Ic23dec4a14489316ecb0e46bbabe246ddae29655 --- services/core/Android.bp | 2 +- .../com/android/protolog/tool/ProtoLogTool.kt | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/services/core/Android.bp b/services/core/Android.bp index 6a3b38e2ccdb9..b7885184a8c36 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -48,7 +48,7 @@ genrule { ":services.core.protolog.json", ], cmd: "cp $(location :generate-protolog.json) $(out) && " + - "{ diff $(out) $(location :services.core.protolog.json) >/dev/null 2>&1 || " + + "{ ! (diff $(out) $(location :services.core.protolog.json) | grep -q '^<') || " + "{ echo -e '\\n\\n################################################################\\n#\\n" + "# ERROR: ProtoLog viewer config is stale. To update it, run:\\n#\\n" + "# cp $(location :generate-protolog.json) " + diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt index 97f3de2c12211..70ac0bee59b32 100644 --- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt +++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogTool.kt @@ -50,14 +50,19 @@ object ProtoLogTool { command.javaSourceArgs.forEach { path -> val file = File(path) val text = file.readText() - val code = tryParse(text, path) - val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration - .get().nameAsString else "" - val newPath = pack.replace('.', '/') + '/' + file.name - val outSrc = when { - containsProtoLogText(text, command.protoLogClassNameArg) -> + val newPath = path + val outSrc = try { + val code = tryParse(text, path) + if (containsProtoLogText(text, command.protoLogClassNameArg)) { transformer.processClass(text, newPath, code) - else -> text + } else { + text + } + } catch (ex: ParsingException) { + // If we cannot parse this file, skip it (and log why). Compilation will fail + // in a subsequent build step. + println("\n${ex.message}\n") + text } outJar.putNextEntry(ZipEntry(newPath)) outJar.write(outSrc.toByteArray()) @@ -91,11 +96,17 @@ object ProtoLogTool { val file = File(path) val text = file.readText() if (containsProtoLogText(text, command.protoLogClassNameArg)) { - val code = tryParse(text, path) - val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration - .get().nameAsString else "" - val newPath = pack.replace('.', '/') + '/' + file.name - builder.processClass(code, newPath) + try { + val code = tryParse(text, path) + val pack = if (code.packageDeclaration.isPresent) code.packageDeclaration + .get().nameAsString else "" + val newPath = pack.replace('.', '/') + '/' + file.name + builder.processClass(code, newPath) + } catch (ex: ParsingException) { + // If we cannot parse this file, skip it (and log why). Compilation will fail + // in a subsequent build step. + println("\n${ex.message}\n") + } } } val out = FileOutputStream(command.viewerConfigJsonArg)