aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorOmer Strulovich <ostrulovich@fb.com>2022-04-08 19:42:09 -0700
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2022-04-08 19:42:09 -0700
commit07d2ac0e51df170b34cd32e91a5e13a3ed4c66d6 (patch)
tree209ad9d2fb6f3f6d3a4fe5e60f5e98ab67d7f5f3 /core
parent46129b6afb3fdee872e0a86255666979f1a975e3 (diff)
downloadktfmt-07d2ac0e51df170b34cd32e91a5e13a3ed4c66d6.tar.gz
Improve handling of `as` and `is` when left hand is a call-chain
Summary: This improves the formatting of casting using the `as` keyword. I am not merging this into the handling of qualified expressions since `as` can only appear in the end of a chain (parenthesis are required to continue the chain in every reasonable case, an unreasonable case is `any as Foo as Bar`, which we can easily support, but why spend time on it) Reviewed By: hick209 Differential Revision: D35503254 fbshipit-source-id: 0bbc1834bccf4842cf9d97d07750b9939720fc22
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt36
-rw-r--r--core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt22
-rw-r--r--core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt20
3 files changed, 52 insertions, 26 deletions
diff --git a/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt b/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt
index 76a930f..b818145 100644
--- a/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt
+++ b/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt
@@ -2068,26 +2068,30 @@ class KotlinInputAstVisitor(
/** Example `a is Int` or `b !is Int` */
override fun visitIsExpression(expression: KtIsExpression) {
- builder.block(ZERO) {
- builder.sync(expression)
- visit(expression.leftHandSide)
- builder.space()
- visit(expression.operationReference)
- builder.breakOp(Doc.FillMode.INDEPENDENT, " ", expressionBreakIndent)
- builder.block(expressionBreakIndent) { visit(expression.typeReference) }
- }
+ builder.sync(expression)
+ val openGroupBeforeLeft = expression.leftHandSide !is KtQualifiedExpression
+ if (openGroupBeforeLeft) builder.open(ZERO)
+ visit(expression.leftHandSide)
+ if (!openGroupBeforeLeft) builder.open(ZERO)
+ builder.breakOp(Doc.FillMode.UNIFIED, " ", expressionBreakIndent)
+ visit(expression.operationReference)
+ builder.breakOp(Doc.FillMode.INDEPENDENT, " ", expressionBreakIndent)
+ builder.block(expressionBreakIndent) { visit(expression.typeReference) }
+ builder.close()
}
/** Example `a as Int` or `a as? Int` */
override fun visitBinaryWithTypeRHSExpression(expression: KtBinaryExpressionWithTypeRHS) {
- builder.block(ZERO) {
- builder.sync(expression)
- visit(expression.left)
- builder.space()
- visit(expression.operationReference)
- builder.breakOp(Doc.FillMode.INDEPENDENT, " ", expressionBreakIndent)
- builder.block(expressionBreakIndent) { visit(expression.right) }
- }
+ builder.sync(expression)
+ val openGroupBeforeLeft = expression.left !is KtQualifiedExpression
+ if (openGroupBeforeLeft) builder.open(ZERO)
+ visit(expression.left)
+ if (!openGroupBeforeLeft) builder.open(ZERO)
+ builder.breakOp(Doc.FillMode.UNIFIED, " ", expressionBreakIndent)
+ visit(expression.operationReference)
+ builder.breakOp(Doc.FillMode.INDEPENDENT, " ", expressionBreakIndent)
+ builder.block(expressionBreakIndent) { visit(expression.right) }
+ builder.close()
}
/**
diff --git a/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt b/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt
index 7b59194..ac893e3 100644
--- a/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt
+++ b/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt
@@ -2122,8 +2122,8 @@ class FormatterTest {
| .boom()[1, 3, 5]
| .lah
| .doo { it }
- | .feep[1] as
- | Boo
+ | .feep[1]
+ | as Boo
|}
|""".trimMargin(),
deduceMaxWidth = true)
@@ -3122,19 +3122,29 @@ class FormatterTest {
|fun castIt(
| something: Any
|) {
+ | doIt(
+ | something
+ | as List<*>)
+ | doIt(
+ | something
+ | is List<*>)
| println(
- | something is
+ | something
+ | is
| List<String>)
| doIt(
- | something as
+ | something
+ | as
| List<String>)
| println(
- | something is
+ | something
+ | is
| PairList<
| String,
| Int>)
| doIt(
- | something as
+ | something
+ | as
| PairList<
| String,
| Int>)
diff --git a/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt b/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt
index d80d131..caec529 100644
--- a/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt
+++ b/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt
@@ -461,22 +461,34 @@ class GoogleStyleFormatterKtTest {
|fun castIt(
| something: Any
|) {
+ | doIt(
+ | something
+ | as List<*>
+ | )
+ | doIt(
+ | something
+ | is List<*>
+ | )
| println(
- | something is
+ | something
+ | is
| List<String>
| )
| doIt(
- | something as
+ | something
+ | as
| List<String>
| )
| println(
- | something is
+ | something
+ | is
| PairList<
| String,
| Int>
| )
| doIt(
- | something as
+ | something
+ | as
| PairList<
| String,
| Int>