Skip to content

Commit 1b5e93b

Browse files
authored
Fix issue with pc breaking in requiredMethod on newly overloaded valueOf (#23708)
We recently started having issues when running completions in metals, with the presentation compiler crashing: ```scala dotty.tools.dotc.core.TypeError$.apply(TypeErrors.scala:54) dotty.tools.dotc.core.Denotations$MultiDenotation.suchThat(Denotations.scala:1280) dotty.tools.dotc.core.Denotations$Denotation.requiredSymbol(Denotations.scala:305) dotty.tools.dotc.core.Denotations$Denotation.requiredMethod(Denotations.scala:321) dotty.tools.pc.completions.Completions.isUninterestingSymbol$lzyINIT1(Completions.scala:744) dotty.tools.pc.completions.Completions.isUninterestingSymbol(Completions.scala:725) dotty.tools.pc.completions.Completions.includeSymbol(Completions.scala:90) dotty.tools.pc.completions.Completions.visit$3(Completions.scala:697) dotty.tools.pc.completions.Completions.filterInteresting$$anonfun$1(Completions.scala:715) scala.collection.immutable.List.foreach(List.scala:334) dotty.tools.pc.completions.Completions.filterInteresting(Completions.scala:715) dotty.tools.pc.completions.Completions.enrichedCompilerCompletions(Completions.scala:118) dotty.tools.pc.completions.Completions.completions(Completions.scala:136) dotty.tools.pc.completions.CompletionProvider.completions(CompletionProvider.scala:139) dotty.tools.pc.ScalaPresentationCompiler.complete$$anonfun$1(ScalaPresentationCompiler.scala:194) dotty.tools.dotc.core.TypeError$$anon$1: Failure to disambiguate overloaded reference with method valueOf in object Predef: [T]: T and method valueOf in object Predef: [T](implicit vt: ValueOf[T]): T ``` This happened after the recent changes to the stdlib, with the, I believe, newly added valueOf overload, and the previously used `requiredMethod` by design not handling these cases. I also noticed that in the same piece of code we had a bit of an empty Symbol factory situation going on, with MultiDenotation being changed into a Symbol (always resulting in an empty symbol), and only later flattened with the `alternatives`, so I changed that too. I can't really test this properly, as the pc tests seem to use an older stdlib, but at least the `wait` methods do resolve properly after these changes, so I have no reason to think the valueOf methods would be any different.
1 parent 212ab3f commit 1b5e93b

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -734,15 +734,18 @@ class Completions(
734734
defn.Object_notifyAll,
735735
defn.Object_notify,
736736
defn.Predef_undefined,
737-
defn.ObjectClass.info.member(nme.wait_).symbol,
738737
// NOTE(olafur) IntelliJ does not complete the root package and without this filter
739738
// then `_root_` would appear as a completion result in the code `foobar(_<COMPLETE>)`
740739
defn.RootPackage,
741740
// NOTE(gabro) valueOf was added as a Predef member in 2.13. We filter it out since is a niche
742741
// use case and it would appear upon typing 'val'
743-
defn.ValueOfClass.info.member(nme.valueOf).symbol,
744-
defn.ScalaPredefModule.requiredMethod(nme.valueOf)
745-
).flatMap(_.alternatives.map(_.symbol)).toSet
742+
defn.ValueOfClass
743+
) ++ (
744+
Set(
745+
defn.ObjectClass.info.member(nme.wait_),
746+
defn.ScalaPredefModule.info.member(nme.valueOf)
747+
).flatMap(_.alternatives.map(_.symbol)).toSet
748+
)
746749

747750
private def isNotLocalForwardReference(sym: Symbol)(using Context): Boolean =
748751
!sym.isLocalToBlock ||

presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,6 @@ class CompletionSuite extends BaseCompletionSuite:
129129
|isInstanceOf[X0]: Boolean
130130
|synchronized[X0](x$0: X0): X0
131131
|toString(): String
132-
|wait(): Unit
133-
|wait(x$0: Long): Unit
134-
|wait(x$0: Long, x$1: Int): Unit
135132
|""".stripMargin
136133
)
137134

0 commit comments

Comments
 (0)