@@ -551,13 +551,18 @@ class DottyLanguageServer extends LanguageServer
551
551
override def signatureHelp (params : TextDocumentPositionParams ) = computeAsync { canceltoken =>
552
552
val uri = new URI (params.getTextDocument.getUri)
553
553
val driver = driverFor(uri)
554
- implicit def ctx : Context = driver.currentCtx
555
554
556
- val pos = sourcePosition(driver, uri, params.getPosition)
557
- val trees = driver.openedTrees(uri)
558
- val path = Interactive .pathTo(trees, pos)
559
- val (paramN, callableN, signatures) = Signatures .signatureHelp(path, pos.span)
560
- new SignatureHelp (signatures.map(signatureToSignatureInformation).asJava, callableN, paramN)
555
+ driver.compilationUnits.get(uri) match
556
+ case Some (unit) =>
557
+ given newCtx : Context = driver.currentCtx.fresh.setCompilationUnit(unit)
558
+ val pos = sourcePosition(driver, uri, params.getPosition)
559
+ val adjustedSpan = pos.span.withEnd(pos.span.end + 1 )
560
+ val path = Interactive .pathTo(ctx.compilationUnit.tpdTree, adjustedSpan)
561
+ val (paramN, callableN, signatures) = Signatures .signatureHelp(path, adjustedSpan)
562
+
563
+ new SignatureHelp (signatures.map(signatureToSignatureInformation).asJava, callableN, paramN)
564
+
565
+ case _ => new SignatureHelp ()
561
566
562
567
}
563
568
@@ -929,23 +934,25 @@ object DottyLanguageServer {
929
934
930
935
/** Convert `signature` to a `SignatureInformation` */
931
936
def signatureToSignatureInformation (signature : Signatures .Signature ): lsp4j.SignatureInformation = {
932
- val tparams = signature.tparams.map(Signatures .Param (" " , _))
933
937
val paramInfoss =
934
- (tparams ::: signature.paramss.flatten).map(paramToParameterInformation)
938
+ (signature.paramss.flatten).map(paramToParameterInformation)
935
939
val paramLists =
936
- if signature.paramss.forall(_.isEmpty) && tparams.nonEmpty then
937
- " "
938
- else
939
- signature.paramss
940
- .map { paramList =>
941
- val labels = paramList.map(_.show)
942
- val prefix = if paramList.exists(_.isImplicit) then " using " else " "
943
- labels.mkString(prefix, " , " , " " )
944
- }
945
- .mkString(" (" , " )(" , " )" )
946
- val tparamsLabel = if (signature.tparams.isEmpty) " " else signature.tparams.mkString(" [" , " , " , " ]" )
940
+ signature.paramss
941
+ .map { paramList =>
942
+ val labels = paramList.map(_.show)
943
+ val isImplicit = paramList.exists:
944
+ case p : Signatures .MethodParam => p.isImplicit
945
+ case _ => false
946
+ val prefix = if isImplicit then " using " else " "
947
+ val isTypeParams = paramList.forall(_.isInstanceOf [Signatures .TypeParam ]) && paramList.nonEmpty
948
+ val wrap : String => String = label => if isTypeParams then
949
+ s " [ $label] "
950
+ else
951
+ s " ( $label) "
952
+ wrap(labels.mkString(prefix, " , " , " " ))
953
+ }.mkString
947
954
val returnTypeLabel = signature.returnType.map(t => s " : $t" ).getOrElse(" " )
948
- val label = s " ${signature.name}$tparamsLabel$ paramLists$returnTypeLabel"
955
+ val label = s " ${signature.name}$paramLists$returnTypeLabel"
949
956
val documentation = signature.doc.map(DottyLanguageServer .markupContent)
950
957
val sig = new lsp4j.SignatureInformation (label)
951
958
sig.setParameters(paramInfoss.asJava)
0 commit comments