Skip to content

Commit cb079b9

Browse files
committed
improvement: sorting workspace members with same name by frequency
1 parent 8e1e229 commit cb079b9

File tree

5 files changed

+73
-15
lines changed

5 files changed

+73
-15
lines changed

presentation-compiler/src/main/dotty/tools/pc/ScalaPresentationCompiler.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ case class ScalaPresentationCompiler(
4848
sh: Option[ScheduledExecutorService] = None,
4949
config: PresentationCompilerConfig = PresentationCompilerConfigImpl(),
5050
folderPath: Option[Path] = None,
51-
reportsLevel: ReportLevel = ReportLevel.Info
51+
reportsLevel: ReportLevel = ReportLevel.Info,
52+
completionItemPriority: CompletionItemPriority = (_: String) => 0,
5253
) extends PresentationCompiler:
5354

5455
def this() = this("", None, Nil, Nil)
@@ -63,6 +64,11 @@ case class ScalaPresentationCompiler(
6364
.map(StdReportContext(_, _ => buildTargetName, reportsLevel))
6465
.getOrElse(EmptyReportContext)
6566

67+
override def withCompletionItemPriority(
68+
priority: CompletionItemPriority
69+
): PresentationCompiler =
70+
copy(completionItemPriority = priority)
71+
6672
override def withBuildTargetName(buildTargetName: String) =
6773
copy(buildTargetName = Some(buildTargetName))
6874

@@ -142,7 +148,8 @@ case class ScalaPresentationCompiler(
142148
params,
143149
config,
144150
buildTargetIdentifier,
145-
folderPath
151+
folderPath,
152+
completionItemPriority
146153
).completions()
147154

148155
}

presentation-compiler/src/main/dotty/tools/pc/completions/CompletionProvider.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@ import org.eclipse.lsp4j.InsertTextFormat
3232
import org.eclipse.lsp4j.InsertTextMode
3333
import org.eclipse.lsp4j.Range as LspRange
3434
import org.eclipse.lsp4j.TextEdit
35+
import scala.meta.pc.CompletionItemPriority
3536

3637
class CompletionProvider(
3738
search: SymbolSearch,
3839
driver: InteractiveDriver,
3940
params: OffsetParams,
4041
config: PresentationCompilerConfig,
4142
buildTargetIdentifier: String,
42-
folderPath: Option[Path]
43+
folderPath: Option[Path],
44+
referenceCounter: CompletionItemPriority
4345
)(using reports: ReportContext):
4446
def completions(): CompletionList =
4547
val uri = params.uri().nn
@@ -86,7 +88,8 @@ class CompletionProvider(
8688
folderPath,
8789
autoImportsGen,
8890
unit.comments,
89-
driver.settings
91+
driver.settings,
92+
referenceCounter
9093
).completions()
9194

9295
val items = completions.zipWithIndex.map { case (item, idx) =>

presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class Completions(
5050
workspace: Option[Path],
5151
autoImports: AutoImportsGenerator,
5252
comments: List[Comment],
53-
options: List[String]
53+
options: List[String],
54+
completionItemPriority: CompletionItemPriority
5455
)(using ReportContext):
5556

5657
given context: Context = ctx
@@ -909,6 +910,20 @@ class Completions(
909910
else 0
910911
end compareLocalSymbols
911912

913+
private def workspaceMemberPriority(symbol: Symbol): Int =
914+
completionItemPriority
915+
.workspaceMemberPriority(
916+
SemanticdbSymbols.symbolName(symbol),
917+
)
918+
919+
def compareFrequency(o1: CompletionValue, o2: CompletionValue): Int =
920+
(o1, o2) match
921+
case (w1: CompletionValue.Workspace, w2: CompletionValue.Workspace) =>
922+
workspaceMemberPriority(w1.symbol)
923+
.compareTo(workspaceMemberPriority(w2.symbol))
924+
case _ => 0
925+
end compareFrequency
926+
912927
def compareByRelevance(o1: CompletionValue, o2: CompletionValue): Int =
913928
Integer.compare(
914929
computeRelevancePenalty(o1, application),
@@ -1018,17 +1033,20 @@ class Completions(
10181033
)
10191034
if byIdentifier != 0 then byIdentifier
10201035
else
1021-
val byOwner =
1022-
s1.owner.fullName.toString
1023-
.compareTo(s2.owner.fullName.toString)
1024-
if byOwner != 0 then byOwner
1036+
val byFrequency = compareFrequency(o1, o2)
1037+
if byFrequency != 0 then byFrequency
10251038
else
1026-
val byParamCount = Integer.compare(
1027-
s1.paramSymss.flatten.size,
1028-
s2.paramSymss.flatten.size
1029-
)
1030-
if byParamCount != 0 then byParamCount
1031-
else s1.detailString.compareTo(s2.detailString)
1039+
val byOwner =
1040+
s1.owner.fullName.toString
1041+
.compareTo(s2.owner.fullName.toString)
1042+
if byOwner != 0 then byOwner
1043+
else
1044+
val byParamCount = Integer.compare(
1045+
s1.paramSymss.flatten.size,
1046+
s2.paramSymss.flatten.size
1047+
)
1048+
if byParamCount != 0 then byParamCount
1049+
else s1.detailString.compareTo(s2.detailString)
10321050
end if
10331051
end if
10341052
end if

presentation-compiler/test/dotty/tools/pc/base/BasePCSuite.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import dotty.tools.pc.utils._
2222
import org.eclipse.lsp4j.MarkupContent
2323
import org.eclipse.lsp4j.jsonrpc.messages.Either as JEither
2424
import org.junit.runner.RunWith
25+
import scala.meta.pc.CompletionItemPriority
2526

2627
object TestResources:
2728
val scalaLibrary = BuildInfo.ideTestsDependencyClasspath.map(_.toPath).toSeq
@@ -30,6 +31,7 @@ object TestResources:
3031

3132
@RunWith(classOf[ReusableClassRunner])
3233
abstract class BasePCSuite extends PcAssertions:
34+
val completionItemPriority: CompletionItemPriority = (_: String) => 0
3335
private val isDebug = ManagementFactory.getRuntimeMXBean.getInputArguments.toString.contains("-agentlib:jdwp")
3436

3537
val tmp = Files.createTempDirectory("stable-pc-tests")
@@ -53,6 +55,7 @@ abstract class BasePCSuite extends PcAssertions:
5355
.withExecutorService(executorService)
5456
.withScheduledExecutorService(executorService)
5557
.withSearch(search)
58+
.withCompletionItemPriority(completionItemPriority)
5659
.newInstance("", myclasspath.asJava, scalacOpts.asJava)
5760

5861
protected def config: PresentationCompilerConfig =
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dotty.tools.pc.tests.completion
2+
3+
import dotty.tools.pc.base.BaseCompletionSuite
4+
import scala.meta.pc.CompletionItemPriority
5+
import org.junit.Test
6+
7+
class CompletionContextSuite extends BaseCompletionSuite:
8+
override val completionItemPriority: CompletionItemPriority = {
9+
case "scala/concurrent/Future." => -1
10+
case _ => 0
11+
}
12+
// scala.concurrent.Future should be ranked higher than java.util.concurrent.Future
13+
val futureCompletionResult: List[String] =
14+
List("Future - scala.concurrent", "Future - java.util.concurrent")
15+
16+
@Test
17+
def `context` =
18+
check(
19+
"""package fut
20+
|object A {
21+
| Futur@@
22+
|}""".stripMargin,
23+
"""Future - scala.concurrent
24+
|Future - java.util.concurrent
25+
|""".stripMargin,
26+
filter = futureCompletionResult.contains
27+
)

0 commit comments

Comments
 (0)