Skip to content

Commit 6c2032a

Browse files
committed
Provide signature help for unapply methods
Related to scalameta/metals#1687
1 parent 859214a commit 6c2032a

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

compiler/src/dotty/tools/dotc/util/Signatures.scala

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import util.Spans.Span
1010
import core.Types.{ErrorType, MethodType, PolyType}
1111
import reporting._
1212

13+
import dotty.tools.dotc.core.Types.Type
1314

1415
object Signatures {
1516

@@ -48,31 +49,40 @@ object Signatures {
4849
*/
4950
def callInfo(path: List[tpd.Tree], span: Span)(using Context): (Int, Int, List[SingleDenotation]) =
5051
path match {
52+
case UnApply(fun, _, patterns) :: _ =>
53+
callInfo(span, patterns, fun, 0)
5154
case Apply(fun, params) :: _ =>
5255
val alreadyAppliedCount = Signatures.countParams(fun)
53-
val paramIndex = params.indexWhere(_.span.contains(span)) match {
54-
case -1 => (params.length - 1 max 0) + alreadyAppliedCount
55-
case n => n + alreadyAppliedCount
56-
}
57-
58-
val (alternativeIndex, alternatives) = fun.tpe match {
59-
case err: ErrorType =>
60-
val (alternativeIndex, alternatives) = alternativesFromError(err, params)
61-
(alternativeIndex, alternatives)
56+
callInfo(span, params, fun, alreadyAppliedCount)
57+
case _ =>
58+
(0, 0, Nil)
59+
}
6260

63-
case _ =>
64-
val funSymbol = fun.symbol
65-
val alternatives = funSymbol.owner.info.member(funSymbol.name).alternatives
66-
val alternativeIndex = alternatives.map(_.symbol).indexOf(funSymbol) max 0
67-
(alternativeIndex, alternatives)
68-
}
61+
def callInfo(
62+
span: Span,
63+
params: List[Tree[Type]],
64+
fun: Tree[Type],
65+
alreadyAppliedCount : Int
66+
)(using Context): (Int, Int, List[SingleDenotation]) =
67+
val paramIndex = params.indexWhere(_.span.contains(span)) match {
68+
case -1 => (params.length - 1 max 0) + alreadyAppliedCount
69+
case n => n + alreadyAppliedCount
70+
}
6971

70-
(paramIndex, alternativeIndex, alternatives)
72+
val (alternativeIndex, alternatives) = fun.tpe match {
73+
case err: ErrorType =>
74+
val (alternativeIndex, alternatives) = alternativesFromError(err, params)
75+
(alternativeIndex, alternatives)
7176

7277
case _ =>
73-
(0, 0, Nil)
78+
val funSymbol = fun.symbol
79+
val alternatives = funSymbol.owner.info.member(funSymbol.name).alternatives
80+
val alternativeIndex = alternatives.map(_.symbol).indexOf(funSymbol) max 0
81+
(alternativeIndex, alternatives)
7482
}
7583

84+
(paramIndex, alternativeIndex, alternatives)
85+
7686
def toSignature(denot: SingleDenotation)(using Context): Option[Signature] = {
7787
val symbol = denot.symbol
7888
val docComment = ParsedComment.docOf(symbol)

language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,7 @@ class DottyLanguageServer extends LanguageServer
556556

557557
val pos = sourcePosition(driver, uri, params.getPosition)
558558
val trees = driver.openedTrees(uri)
559-
val path = Interactive.pathTo(trees, pos).dropWhile(!_.isInstanceOf[Apply])
560-
559+
val path = Interactive.pathTo(trees, pos).dropWhile(t => !t.isInstanceOf[Apply] && !t.isInstanceOf[UnApply])
561560
val (paramN, callableN, alternatives) = Signatures.callInfo(path, pos.span)
562561
val signatureInfos = alternatives.flatMap(Signatures.toSignature)
563562

language-server/test/dotty/tools/languageserver/SignatureHelpTest.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,4 +361,18 @@ class SignatureHelpTest {
361361
)), Some("Int"), Some("Buzzes a fizz up to bar"))
362362
), None, 0)
363363
}
364+
365+
@Test def unapplyMethod: Unit = {
366+
code"""|object Main {
367+
| Option(1) match {
368+
| case Some(${m1}) =>
369+
| }
370+
|}"""
371+
.withSource
372+
.signatureHelp(m1, List(
373+
S("unapply[A]", Nil, List(List(
374+
P("x$0", "Some[A]", None),
375+
)), Some("Option[A]"), None)
376+
), None, 0)
377+
}
364378
}

0 commit comments

Comments
 (0)