diff --git a/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java b/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java index 505835c77f..e979995b90 100644 --- a/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java +++ b/wire-java-generator/src/main/java/com/squareup/wire/java/JavaGenerator.java @@ -624,6 +624,8 @@ static String sanitizeJavadoc(String documentation) { documentation = documentation.replaceAll("\\s+$", ""); documentation = documentation.replaceAll("\\*/", "*/"); documentation = documentation.replaceAll("/\\*", "/*"); + // Java translates Unicode escapes before lexing, including inside comments. + documentation = documentation.replace("\\", "\"); // Rewrite '@see ' to use an html anchor tag documentation = documentation.replaceAll("@see (http:" + URL_CHARS + "+)", "@see $1"); diff --git a/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java b/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java index d9d870f748..39820078a9 100644 --- a/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java +++ b/wire-java-generator/src/test/java/com/squareup/wire/java/JavaGeneratorTest.java @@ -50,6 +50,13 @@ public void sanitizeJavadocStarSlash() { assertThat(JavaGenerator.sanitizeJavadoc(input)).isEqualTo(expected); } + @Test + public void sanitizeJavadocUnicodeEscapes() { + String input = "\\u002a\\u002f class Cheeky { } \\u002f\\u002a"; + String expected = "\u002a\u002f class Cheeky { } \u002f\u002a"; + assertThat(JavaGenerator.sanitizeJavadoc(input)).isEqualTo(expected); + } + @Test public void generatedOptionTypeSanitizesJavadoc() throws Exception { Schema schema = @@ -74,6 +81,26 @@ public void generatedOptionTypeSanitizesJavadoc() throws Exception { assertThat(javaOutput).doesNotContain("*/ class Cheeky"); } + @Test + public void generatedFieldSanitizesJavadocUnicodeEscapes() throws Exception { + Schema schema = + new SchemaBuilder() + .add( + Path.get("message.proto"), + "" + + "syntax = \"proto2\";\n" + + "message Message {\n" + + " // \\u002a\\u002f class Cheeky { } \\u002f\\u002a\n" + + " optional string owner = 1;\n" + + "}\n") + .build(); + + String javaOutput = new JavaWithProfilesGenerator(schema).generateJava("Message"); + + assertThat(javaOutput).contains("\u002a\u002f class Cheeky { } \u002f\u002a"); + assertThat(javaOutput).doesNotContain("\\u002a\\u002f class Cheeky"); + } + @Test public void enclosingTypeSanitizesJavadoc() throws Exception { Schema schema =