From b7b74c2dbf05eeefd32e7658c5a7035aec606974 Mon Sep 17 00:00:00 2001 From: David Torosyan Date: Thu, 16 Dec 2021 11:15:49 -0800 Subject: [PATCH] Consolidate Escaping.kt into one class Summary: Some more refactoring, this time to group all the functions in this file under one class to make it easier to keep track of the static helpers. Reviewed By: strulovich Differential Revision: D33146489 fbshipit-source-id: a8ed82738aca0266f5772624fb04128d1075c4d3 --- .../com/facebook/ktfmt/format/Formatter.kt | 4 +- .../java/com/facebook/ktfmt/kdoc/Escaping.kt | 53 ++++++++++--------- .../com/facebook/ktfmt/kdoc/KDocFormatter.kt | 4 +- .../{EscapingKtTest.kt => EscapingTest.kt} | 16 +++--- 4 files changed, 41 insertions(+), 36 deletions(-) rename core/src/test/java/com/facebook/ktfmt/kdoc/{EscapingKtTest.kt => EscapingTest.kt} (60%) diff --git a/core/src/main/java/com/facebook/ktfmt/format/Formatter.kt b/core/src/main/java/com/facebook/ktfmt/format/Formatter.kt index 0ad86100..05d48f75 100644 --- a/core/src/main/java/com/facebook/ktfmt/format/Formatter.kt +++ b/core/src/main/java/com/facebook/ktfmt/format/Formatter.kt @@ -21,8 +21,8 @@ import com.facebook.ktfmt.format.FormattingOptions.Style.DROPBOX import com.facebook.ktfmt.format.FormattingOptions.Style.GOOGLE import com.facebook.ktfmt.format.RedundantElementRemover.dropRedundantElements import com.facebook.ktfmt.format.WhitespaceTombstones.indexOfWhitespaceTombstone +import com.facebook.ktfmt.kdoc.Escaping import com.facebook.ktfmt.kdoc.KDocCommentsHelper -import com.facebook.ktfmt.kdoc.indexOfCommentEscapeSequences import com.google.common.collect.ImmutableList import com.google.common.collect.Range import com.google.googlejavaformat.Doc @@ -121,7 +121,7 @@ object Formatter { private fun checkEscapeSequences(code: String) { var index = code.indexOfWhitespaceTombstone() if (index == -1) { - index = indexOfCommentEscapeSequences(code) + index = Escaping.indexOfCommentEscapeSequences(code) } if (index != -1) { throw ParseError( diff --git a/core/src/main/java/com/facebook/ktfmt/kdoc/Escaping.kt b/core/src/main/java/com/facebook/ktfmt/kdoc/Escaping.kt index a28a0ce8..c77d4f12 100644 --- a/core/src/main/java/com/facebook/ktfmt/kdoc/Escaping.kt +++ b/core/src/main/java/com/facebook/ktfmt/kdoc/Escaping.kt @@ -16,35 +16,38 @@ package com.facebook.ktfmt.kdoc -private const val SLASH_STAR_ESCAPE = "\u0004\u0005" +object Escaping { -private const val STAR_SLASH_ESCAPE = "\u0005\u0004" + private const val SLASH_STAR_ESCAPE = "\u0004\u0005" -fun indexOfCommentEscapeSequences(s: String) = - s.indexOfAny(listOf(SLASH_STAR_ESCAPE, STAR_SLASH_ESCAPE)) + private const val STAR_SLASH_ESCAPE = "\u0005\u0004" -/** - * kotlin-compiler's KDoc lexer doesn't correctly handle nested slash-star comments, so we escape - * them into tombstones, format, then unescape. - */ -fun escapeKDoc(s: String): String { - val startMarkerIndex = s.indexOf("/*") - val endMarkerIndex = s.lastIndexOf("*/") + fun indexOfCommentEscapeSequences(s: String) = + s.indexOfAny(listOf(SLASH_STAR_ESCAPE, STAR_SLASH_ESCAPE)) + + /** + * kotlin-compiler's KDoc lexer doesn't correctly handle nested slash-star comments, so we escape + * them into tombstones, format, then unescape. + */ + fun escapeKDoc(s: String): String { + val startMarkerIndex = s.indexOf("/*") + val endMarkerIndex = s.lastIndexOf("*/") + + if (startMarkerIndex == -1 || endMarkerIndex == -1) { + throw RuntimeException("KDoc with no /** and/or */") + } - if (startMarkerIndex == -1 || endMarkerIndex == -1) { - throw RuntimeException("KDoc with no /** and/or */") + return s.substring(0, startMarkerIndex + 3) + + s.substring(startMarkerIndex + 3, endMarkerIndex) + .replace("/*", SLASH_STAR_ESCAPE) + .replace("*/", STAR_SLASH_ESCAPE) + + s.substring(endMarkerIndex) } - return s.substring(0, startMarkerIndex + 3) + - s.substring(startMarkerIndex + 3, endMarkerIndex) - .replace("/*", SLASH_STAR_ESCAPE) - .replace("*/", STAR_SLASH_ESCAPE) + - s.substring(endMarkerIndex) + /** + * + * See [escapeKDoc]. + */ + fun unescapeKDoc(s: String): String = + s.replace(SLASH_STAR_ESCAPE, "/*").replace(STAR_SLASH_ESCAPE, "*/") } - -/** - * - * See [escapeKDoc]. - */ -fun unescapeKDoc(s: String): String = - s.replace(SLASH_STAR_ESCAPE, "/*").replace(STAR_SLASH_ESCAPE, "*/") diff --git a/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt b/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt index 30ed37c2..0c2ec537 100644 --- a/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt +++ b/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt @@ -60,7 +60,7 @@ object KDocFormatter { * start and end with the same characters. */ fun formatKDoc(input: String, blockIndent: Int, maxLineLength: Int): String { - val escapedInput = escapeKDoc(input) + val escapedInput = Escaping.escapeKDoc(input) val kDocLexer = KDocLexer() kDocLexer.start(escapedInput) val tokens = mutableListOf() @@ -138,7 +138,7 @@ object KDocFormatter { BEGIN_KDOC -> output.writeBeginJavadoc() END_KDOC -> { output.writeEndJavadoc() - return unescapeKDoc(output.toString()) + return Escaping.unescapeKDoc(output.toString()) } LIST_ITEM_OPEN_TAG -> output.writeListItemOpen(token) PRE_OPEN_TAG -> output.writePreOpen(token) diff --git a/core/src/test/java/com/facebook/ktfmt/kdoc/EscapingKtTest.kt b/core/src/test/java/com/facebook/ktfmt/kdoc/EscapingTest.kt similarity index 60% rename from core/src/test/java/com/facebook/ktfmt/kdoc/EscapingKtTest.kt rename to core/src/test/java/com/facebook/ktfmt/kdoc/EscapingTest.kt index 757b9cdd..30e52bdf 100644 --- a/core/src/test/java/com/facebook/ktfmt/kdoc/EscapingKtTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/kdoc/EscapingTest.kt @@ -22,16 +22,18 @@ import org.junit.runner.RunWith import org.junit.runners.JUnit4 @RunWith(JUnit4::class) -class EscapingKtTest { +class EscapingTest { @Test fun `escaping kdoc`() { - assertThat(escapeKDoc("/** foo */")).isEqualTo("/** foo */") - assertThat(escapeKDoc("/*** foo */")).isEqualTo("/*** foo */") - assertThat(escapeKDoc("/** * foo */")).isEqualTo("/** * foo */") - assertThat(escapeKDoc("/** /* foo */")).isEqualTo("/** \u0004\u0005 foo */") - assertThat(escapeKDoc("/** /* foo */ */")).isEqualTo("/** \u0004\u0005 foo \u0005\u0004 */") + assertThat(Escaping.escapeKDoc("/** foo */")).isEqualTo("/** foo */") + assertThat(Escaping.escapeKDoc("/*** foo */")).isEqualTo("/*** foo */") + assertThat(Escaping.escapeKDoc("/** * foo */")).isEqualTo("/** * foo */") + assertThat(Escaping.escapeKDoc("/** /* foo */")).isEqualTo("/** \u0004\u0005 foo */") + assertThat(Escaping.escapeKDoc("/** /* foo */ */")) + .isEqualTo("/** \u0004\u0005 foo \u0005\u0004 */") - assertThat(escapeKDoc("/* /* foo */ */")).isEqualTo("/* \u0004\u0005 foo \u0005\u0004 */") + assertThat(Escaping.escapeKDoc("/* /* foo */ */")) + .isEqualTo("/* \u0004\u0005 foo \u0005\u0004 */") } }