From ff1bc12c09fc7f509321e938967bc5d586de3f5a Mon Sep 17 00:00:00 2001 From: Lucas Nouguier Date: Wed, 10 Apr 2024 08:42:00 +0200 Subject: [PATCH] Fix active param index for empty param lists (#20142) Fixes #19969 with @mbovel @rochala --------- Co-authored-by: Lucas Nouguier [Cherry-picked adf089bd38bd885983e4fc3506ec5f0aef796dd2] --- .../dotty/tools/dotc/util/Signatures.scala | 7 ++++-- .../pc/base/BaseSignatureHelpSuite.scala | 2 +- .../signaturehelp/SignatureHelpSuite.scala | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/util/Signatures.scala b/compiler/src/dotty/tools/dotc/util/Signatures.scala index 0bd407261125..d9daf7f5ac42 100644 --- a/compiler/src/dotty/tools/dotc/util/Signatures.scala +++ b/compiler/src/dotty/tools/dotc/util/Signatures.scala @@ -196,7 +196,8 @@ object Signatures { fun: tpd.Tree, isTypeApply: Boolean = false )(using Context): (Int, Int, List[Signature]) = - def treeQualifier(tree: tpd.Tree): tpd.Tree = tree match + def treeQualifier(tree: tpd.Tree): tpd.Tree = + tree match case Apply(qual, _) => treeQualifier(qual) case TypeApply(qual, _) => treeQualifier(qual) case AppliedTypeTree(qual, _) => treeQualifier(qual) @@ -247,7 +248,9 @@ object Signatures { val alternativeSignatures = alternativesWithTypes .flatMap(toApplySignature(_, findOutermostCurriedApply(untpdPath), safeParamssListIndex)) - val finalParamIndex = currentParamsIndex + previousArgs + val finalParamIndex = + if currentParamsIndex == -1 then -1 + else previousArgs + currentParamsIndex (finalParamIndex, alternativeIndex, alternativeSignatures) else (0, 0, Nil) diff --git a/presentation-compiler/test/dotty/tools/pc/base/BaseSignatureHelpSuite.scala b/presentation-compiler/test/dotty/tools/pc/base/BaseSignatureHelpSuite.scala index ca647502fabf..5f73b108e4de 100644 --- a/presentation-compiler/test/dotty/tools/pc/base/BaseSignatureHelpSuite.scala +++ b/presentation-compiler/test/dotty/tools/pc/base/BaseSignatureHelpSuite.scala @@ -43,7 +43,7 @@ abstract class BaseSignatureHelpSuite extends BasePCSuite: out .append(signature.getLabel) .append("\n") - if (result.getActiveSignature == i && result.getActiveParameter != null && signature.getParameters.size() > 0) { + if (result.getActiveSignature == i && result.getActiveParameter != null && result.getActiveParameter() >= 0 && signature.getParameters.size() > 0) { val param = signature.getParameters.get(result.getActiveParameter) val label = param.getLabel.getLeft() /* We need to find the label of the active parameter and show ^ at that spot diff --git a/presentation-compiler/test/dotty/tools/pc/tests/signaturehelp/SignatureHelpSuite.scala b/presentation-compiler/test/dotty/tools/pc/tests/signaturehelp/SignatureHelpSuite.scala index ac63ef92aef5..f7dca3e26c66 100644 --- a/presentation-compiler/test/dotty/tools/pc/tests/signaturehelp/SignatureHelpSuite.scala +++ b/presentation-compiler/test/dotty/tools/pc/tests/signaturehelp/SignatureHelpSuite.scala @@ -1533,3 +1533,28 @@ class SignatureHelpSuite extends BaseSignatureHelpSuite: |foo(i: Boolean, s: String)(b: Int): Unit |""".stripMargin ) + + @Test def `proper-param-empty-list` = + check( + """ + |object x { + | def foo[K, V](): Unit = ??? + | foo(@@) + |} + |""".stripMargin, + "foo[K, V](): Unit" + ) + + @Test def `proper-param-list-after-param-empty-list` = + check( + """ + |object x { + | def foo[K, V]()(x: Int): Unit = ??? + | foo()(@@) + |} + |""".stripMargin, + """ + |foo[K, V]()(x: Int): Unit + | ^^^^^^ + """.stripMargin + )