From 5fc9c5671ca0070583c3856fb64faf0a6eb25721 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 24 Jan 2018 21:47:59 +0300 Subject: [PATCH] Kapt: Escape nested comments in doc comments (KT-22469) --- .../kotlin/kapt3/stubs/KDocCommentKeeper.kt | 30 ++++++++++++++++++- .../testData/converter/comments.kt | 7 ++++- .../testData/converter/comments.txt | 12 ++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt index c77e26bee5f..6620132e319 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt @@ -96,7 +96,35 @@ class KDocCommentKeeper(private val kaptContext: KaptContext<*>) { return } - docCommentTable.putComment(tree, KDocComment(extractCommentText(docComment))) + docCommentTable.putComment(tree, KDocComment(escapeNestedComments(extractCommentText(docComment)))) + } + + private fun escapeNestedComments(text: String): String { + val result = StringBuilder() + + var index = 0 + var commentLevel = 0 + + while (index < text.length) { + val currentChar = text[index] + fun nextChar() = text.getOrNull(index + 1) + + if (currentChar == '/' && nextChar() == '*') { + commentLevel++ + index++ + result.append("/ *") + } else if (currentChar == '*' && nextChar() == '/') { + commentLevel = maxOf(0, commentLevel - 1) + index++ + result.append("* /") + } else { + result.append(currentChar) + } + + index++ + } + + return result.toString() } private fun extractCommentText(docComment: KDoc): String { diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/comments.kt b/plugins/kapt3/kapt3-compiler/testData/converter/comments.kt index 08dfc918730..5419e8a5e58 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/comments.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/comments.kt @@ -59,4 +59,9 @@ enum class EnumError { }; abstract fun doIt(): String -} \ No newline at end of file +} + +/** + * `/* Failure */` + */ +interface TestComponent \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/comments.txt b/plugins/kapt3/kapt3-compiler/testData/converter/comments.txt index 62f00e5fd59..026e636ae83 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/comments.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/comments.txt @@ -182,3 +182,15 @@ public final class Test4 { super(); } } + +//////////////////// + + +import java.lang.System; + +/** + * * `/ * Failure * /` + */ +@kotlin.Metadata() +public abstract interface TestComponent { +}