diff --git a/src/printers/expressions.ts b/src/printers/expressions.ts index e587c370..24b1bf7d 100644 --- a/src/printers/expressions.ts +++ b/src/printers/expressions.ts @@ -7,6 +7,7 @@ import { type TernaryExpressionNode } from "../node-types.ts"; import { + createTypeCheckFunction, hasChild, hasDanglingComments, hasType, @@ -1364,6 +1365,19 @@ function printBinaryExpressions( const logicalOperators = new Set(["||", "&&"]); +const isType = createTypeCheckFunction([ + SyntaxType.VoidType, + SyntaxType.IntegralType, + SyntaxType.FloatingPointType, + SyntaxType.FloatingPointType, + SyntaxType.BooleanType, + SyntaxType.TypeIdentifier, + SyntaxType.ScopedTypeIdentifier, + SyntaxType.GenericType, + SyntaxType.ArrayType, + SyntaxType.AnnotatedType +]); + function isSimpleCallArgument(node: NamedNode, depth = 2): boolean { if (depth <= 0) { return false; @@ -1417,7 +1431,8 @@ function isSimpleCallArgument(node: NamedNode, depth = 2): boolean { node.type === SyntaxType.MethodReference || node.type === SyntaxType.UpdateExpression ) { - return isSimpleCallArgument(node.namedChildren[0], depth); + const [qualifierNode] = node.namedChildren; + return isType(qualifierNode) || isSimpleCallArgument(qualifierNode, depth); } return false; @@ -1440,11 +1455,11 @@ function isLiteral(node: NamedNode) { ); } -function isSingleWordType(node: NamedNode) { - return [SyntaxType.Identifier, SyntaxType.This, SyntaxType.Super].includes( - node.type - ); -} +const isSingleWordType = createTypeCheckFunction([ + SyntaxType.Identifier, + SyntaxType.This, + SyntaxType.Super +]); function couldExpandArg(arg: NamedNode, lambdaChainRecursion = false) { if ( diff --git a/test/unit-test/member_chain/_input.java b/test/unit-test/member_chain/_input.java index 4a32f80a..1e8e2d46 100644 --- a/test/unit-test/member_chain/_input.java +++ b/test/unit-test/member_chain/_input.java @@ -146,6 +146,22 @@ public void multipleInvocationsOnNewExpression() { void methodReferences() { dtoEntities.stream().map(UserDto::toString).forEach(LOGGER::info); + + a.b() + .c() + .d(E[]::f); + + a.b() + .c() + .d(e.E[]::f); + + a.b() + .c() + .d(E::f); + + a.b() + .c() + .d(e.E::f); } void classLiteralArgument() { diff --git a/test/unit-test/member_chain/_output.java b/test/unit-test/member_chain/_output.java index e06f6c21..d568e8f2 100644 --- a/test/unit-test/member_chain/_output.java +++ b/test/unit-test/member_chain/_output.java @@ -201,6 +201,14 @@ public void multipleInvocationsOnNewExpression() { void methodReferences() { dtoEntities.stream().map(UserDto::toString).forEach(LOGGER::info); + + a.b().c().d(E[]::f); + + a.b().c().d(e.E[]::f); + + a.b().c().d(E::f); + + a.b().c().d(e.E::f); } void classLiteralArgument() {