Skip to content

Commit a37dac6

Browse files
authored
bugfix: in semanticdb make synthetic apply disambiguator consistent w/ Scala 2 implicit (#17341)
semanticdb - symbol name computation considers synthetic overloads as less specific
2 parents 0749565 + bef7a4a commit a37dac6

File tree

8 files changed

+103
-23
lines changed

8 files changed

+103
-23
lines changed

Diff for: compiler/src/dotty/tools/dotc/semanticdb/SemanticSymbolBuilder.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class SemanticSymbolBuilder:
8484
else
8585
decls0
8686
end decls
87-
val alts = decls.filter(_.isOneOf(Method | Mutable)).toList.reverse
87+
val alts = decls.filter(_.isOneOf(Method | Mutable)).toList.reverse.partition(!_.is(Synthetic)).toList.flatten
8888
def find(filter: Symbol => Boolean) = alts match
8989
case notSym :: rest if !filter(notSym) =>
9090
val idx = rest.indexWhere(filter).ensuring(_ >= 0)

Diff for: tests/semanticdb/expect/CaseClass.expect.scala

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package caseclass
2+
3+
case class CaseClass/*<-caseclass::CaseClass#*/(int1/*<-caseclass::CaseClass#int1.*/: Int/*->scala::Int#*/, int2/*<-caseclass::CaseClass#int2.*/: Int/*->scala::Int#*/)
4+
5+
object CaseClass/*<-caseclass::CaseClass.*/:
6+
def apply/*<-caseclass::CaseClass.apply().*/(int/*<-caseclass::CaseClass.apply().(int)*/: Int/*->scala::Int#*/): CaseClass/*->caseclass::CaseClass#*/ = CaseClass/*->caseclass::CaseClass.*/(int/*->caseclass::CaseClass.apply().(int)*/, 0)
7+
def apply/*<-caseclass::CaseClass.apply(+1).*/(): CaseClass/*->caseclass::CaseClass#*/ = CaseClass/*->caseclass::CaseClass.*/(0, 0)

Diff for: tests/semanticdb/expect/CaseClass.scala

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package caseclass
2+
3+
case class CaseClass(int1: Int, int2: Int)
4+
5+
object CaseClass:
6+
def apply(int: Int): CaseClass = CaseClass(int, 0)
7+
def apply(): CaseClass = CaseClass(0, 0)

Diff for: tests/semanticdb/expect/Enums.expect.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ object Enums/*<-_empty_::Enums.*/:
4646
enum <:</*<-_empty_::Enums.`<:<`#*/[-A/*<-_empty_::Enums.`<:<`#[A]*/, B/*<-_empty_::Enums.`<:<`#[B]*/]:
4747
case Refl/*<-_empty_::Enums.`<:<`.Refl#*/[C/*<-_empty_::Enums.`<:<`.Refl#[C]*/]() extends (C/*->_empty_::Enums.`<:<`.Refl#[C]*/ <:</*->_empty_::Enums.`<:<`#*/ C/*->_empty_::Enums.`<:<`.Refl#[C]*/)
4848

49-
object <:</*<-_empty_::Enums.`<:<`.*/ :
49+
object `<:</*<-_empty_::Enums.`<:<`.*/`:
5050
given [T/*<-_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/]: (T/*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/ <:</*->_empty_::Enums.`<:<`#*/ T/*->_empty_::Enums.`<:<`.`given_<:<_T_T`().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*/()
5151

5252
extension [A/*<-_empty_::Enums.unwrap().[A]*/, B/*<-_empty_::Enums.unwrap().[B]*/](opt/*<-_empty_::Enums.unwrap().(opt)*/: Option/*->scala::Option#*/[A/*->_empty_::Enums.unwrap().[A]*/]) def unwrap/*<-_empty_::Enums.unwrap().*/(using ev/*<-_empty_::Enums.unwrap().(ev)*/: A/*->_empty_::Enums.unwrap().[A]*/ <:</*->_empty_::Enums.`<:<`#*/ Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]): Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/] = ev/*->_empty_::Enums.unwrap().(ev)*/ match

Diff for: tests/semanticdb/expect/Enums.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ object Enums:
4646
enum <:<[-A, B]:
4747
case Refl[C]() extends (C <:< C)
4848

49-
object <:< :
49+
object `<:<`:
5050
given [T]: (T <:< T) = Refl()
5151

5252
extension [A, B](opt: Option[A]) def unwrap(using ev: A <:< Option[B]): Option[B] = ev match

Diff for: tests/semanticdb/expect/Givens.expect.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ object Givens/*<-a::b::Givens.*/:
2222
def empty/*<-a::b::Givens.given_Monoid_String.empty().*/ = ""
2323
extension (x/*<-a::b::Givens.given_Monoid_String.combine().(x)*/: String/*->scala::Predef.String#*/) def combine/*<-a::b::Givens.given_Monoid_String.combine().*/(y/*<-a::b::Givens.given_Monoid_String.combine().(y)*/: String/*->scala::Predef.String#*/) = x/*->a::b::Givens.given_Monoid_String.combine().(x)*/ +/*->java::lang::String#`+`().*/ y/*->a::b::Givens.given_Monoid_String.combine().(y)*/
2424

25-
inline given int2String/*<-a::b::Givens.int2String().*/: Conversion/*->scala::Conversion#*/[Int/*->scala::Int#*/, String/*->scala::Predef.String#*/] = _.toString/*->scala::Any#toString().*/
25+
inline given int2String/*<-a::b::Givens.int2String().*/: Conversion/*->scala::Conversion#*/[Int/*->scala::Int#*/, String/*->scala::Predef.String#*/] with
26+
def apply/*<-a::b::Givens.int2String#apply().*/(x/*<-a::b::Givens.int2String#apply().(x)*/: Int/*->scala::Int#*/): String/*->scala::Predef.String#*/ = x/*->a::b::Givens.int2String#apply().(x)*/.toString/*->scala::Any#toString().*/
2627

2728
def foo/*<-a::b::Givens.foo().*/[A/*<-a::b::Givens.foo().[A]*/](using A/*<-a::b::Givens.foo().(A)*/: Monoid/*->a::b::Givens.Monoid#*/[A/*->a::b::Givens.foo().[A]*/]): A/*->a::b::Givens.foo().[A]*/ = A/*->a::b::Givens.foo().(A)*/.combine/*->a::b::Givens.Monoid#combine().*/(A/*->a::b::Givens.foo().(A)*/.empty/*->a::b::Givens.Monoid#empty().*/)(A/*->a::b::Givens.foo().(A)*/.empty/*->a::b::Givens.Monoid#empty().*/)

Diff for: tests/semanticdb/expect/Givens.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ object Givens:
2222
def empty = ""
2323
extension (x: String) def combine(y: String) = x + y
2424

25-
inline given int2String: Conversion[Int, String] = _.toString
25+
inline given int2String: Conversion[Int, String] with
26+
def apply(x: Int): String = x.toString
2627

2728
def foo[A](using A: Monoid[A]): A = A.combine(A.empty)(A.empty)

Diff for: tests/semanticdb/metac.expect

+82-18
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,60 @@ Occurrences:
477477
[4:4..4:7): bar <- angiven/AnonymousGiven$package.bar().
478478
[4:14..4:17): Foo -> angiven/Foo#
479479

480+
expect/CaseClass.scala
481+
----------------------
482+
483+
Summary:
484+
Schema => SemanticDB v4
485+
Uri => CaseClass.scala
486+
Text => empty
487+
Language => Scala
488+
Symbols => 22 entries
489+
Occurrences => 17 entries
490+
491+
Symbols:
492+
caseclass/CaseClass# => case class CaseClass extends Object with Product with Serializable { self: CaseClass => +8 decls }
493+
caseclass/CaseClass#_1(). => method _1 => Int
494+
caseclass/CaseClass#_2(). => method _2 => Int
495+
caseclass/CaseClass#`<init>`(). => primary ctor <init> (val param int1: Int, val param int2: Int): CaseClass
496+
caseclass/CaseClass#`<init>`().(int1) => val param int1: Int
497+
caseclass/CaseClass#`<init>`().(int2) => val param int2: Int
498+
caseclass/CaseClass#copy$default$1(). => method copy$default$1 => Int @uncheckedVariance
499+
caseclass/CaseClass#copy$default$2(). => method copy$default$2 => Int @uncheckedVariance
500+
caseclass/CaseClass#copy(). => method copy (param int1: Int, param int2: Int): CaseClass
501+
caseclass/CaseClass#copy().(int1) => param int1: Int
502+
caseclass/CaseClass#copy().(int2) => param int2: Int
503+
caseclass/CaseClass#int1. => val method int1 Int
504+
caseclass/CaseClass#int2. => val method int2 Int
505+
caseclass/CaseClass. => final object CaseClass extends Object { self: CaseClass.type => +5 decls }
506+
caseclass/CaseClass.apply(). => method apply (param int: Int): CaseClass
507+
caseclass/CaseClass.apply().(int) => param int: Int
508+
caseclass/CaseClass.apply(+1). => method apply (): CaseClass
509+
caseclass/CaseClass.apply(+2). => method apply (param int1: Int, param int2: Int): CaseClass
510+
caseclass/CaseClass.apply(+2).(int1) => param int1: Int
511+
caseclass/CaseClass.apply(+2).(int2) => param int2: Int
512+
caseclass/CaseClass.unapply(). => method unapply (param x$1: CaseClass): CaseClass
513+
caseclass/CaseClass.unapply().(x$1) => param x$1: CaseClass
514+
515+
Occurrences:
516+
[0:8..0:17): caseclass <- caseclass/
517+
[2:11..2:20): CaseClass <- caseclass/CaseClass#
518+
[2:20..2:20): <- caseclass/CaseClass#`<init>`().
519+
[2:21..2:25): int1 <- caseclass/CaseClass#int1.
520+
[2:27..2:30): Int -> scala/Int#
521+
[2:32..2:36): int2 <- caseclass/CaseClass#int2.
522+
[2:38..2:41): Int -> scala/Int#
523+
[4:7..4:16): CaseClass <- caseclass/CaseClass.
524+
[5:6..5:11): apply <- caseclass/CaseClass.apply().
525+
[5:12..5:15): int <- caseclass/CaseClass.apply().(int)
526+
[5:17..5:20): Int -> scala/Int#
527+
[5:23..5:32): CaseClass -> caseclass/CaseClass#
528+
[5:35..5:44): CaseClass -> caseclass/CaseClass.
529+
[5:45..5:48): int -> caseclass/CaseClass.apply().(int)
530+
[6:6..6:11): apply <- caseclass/CaseClass.apply(+1).
531+
[6:15..6:24): CaseClass -> caseclass/CaseClass#
532+
[6:27..6:36): CaseClass -> caseclass/CaseClass.
533+
480534
expect/Classes.scala
481535
--------------------
482536

@@ -1232,7 +1286,7 @@ Occurrences:
12321286
[46:28..46:29): C -> _empty_/Enums.`<:<`.Refl#[C]
12331287
[46:30..46:33): <:< -> _empty_/Enums.`<:<`#
12341288
[46:34..46:35): C -> _empty_/Enums.`<:<`.Refl#[C]
1235-
[48:9..48:12): <:< <- _empty_/Enums.`<:<`.
1289+
[48:10..48:13): <:< <- _empty_/Enums.`<:<`.
12361290
[49:11..49:12): T <- _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
12371291
[49:16..49:17): T -> _empty_/Enums.`<:<`.`given_<:<_T_T`().[T]
12381292
[49:18..49:21): <:< -> _empty_/Enums.`<:<`#
@@ -1583,12 +1637,12 @@ Schema => SemanticDB v4
15831637
Uri => Givens.scala
15841638
Text => empty
15851639
Language => Scala
1586-
Symbols => 29 entries
1587-
Occurrences => 66 entries
1640+
Symbols => 33 entries
1641+
Occurrences => 72 entries
15881642
Synthetics => 3 entries
15891643

15901644
Symbols:
1591-
a/b/Givens. => final object Givens extends Object { self: Givens.type => +12 decls }
1645+
a/b/Givens. => final object Givens extends Object { self: Givens.type => +13 decls }
15921646
a/b/Givens.Monoid# => trait Monoid [typeparam A ] extends Object { self: Monoid[A] => +4 decls }
15931647
a/b/Givens.Monoid#[A] => typeparam A
15941648
a/b/Givens.Monoid#`<init>`(). => primary ctor <init> [typeparam A ](): Monoid[A]
@@ -1606,7 +1660,11 @@ a/b/Givens.given_Monoid_String.combine().(y) => param y: String
16061660
a/b/Givens.given_Monoid_String.empty(). => method empty => String <: a/b/Givens.Monoid#empty().
16071661
a/b/Givens.goodbye1. => val method goodbye1 String
16081662
a/b/Givens.hello1. => val method hello1 String
1609-
a/b/Givens.int2String(). => final implicit given inline macro int2String => Conversion[Int, String]
1663+
a/b/Givens.int2String# => implicit given class int2String extends Conversion[Int, String] { self: int2String => +2 decls }
1664+
a/b/Givens.int2String#`<init>`(). => primary ctor <init> (): int2String
1665+
a/b/Givens.int2String#apply(). => method apply (param x: Int): String <: scala/Conversion#apply()., scala/Function1#apply().
1666+
a/b/Givens.int2String#apply().(x) => param x: Int
1667+
a/b/Givens.int2String(). => final implicit given inline macro int2String => int2String
16101668
a/b/Givens.sayGoodbye(). => method sayGoodbye [typeparam B ](param any: B): String
16111669
a/b/Givens.sayGoodbye().(any) => param any: B
16121670
a/b/Givens.sayGoodbye().[B] => typeparam B
@@ -1670,21 +1728,27 @@ Occurrences:
16701728
[22:55..22:56): y -> a/b/Givens.given_Monoid_String.combine().(y)
16711729
[24:15..24:25): int2String <- a/b/Givens.int2String().
16721730
[24:27..24:37): Conversion -> scala/Conversion#
1731+
[24:27..24:27): <- a/b/Givens.int2String#`<init>`().
16731732
[24:38..24:41): Int -> scala/Int#
16741733
[24:43..24:49): String -> scala/Predef.String#
1675-
[24:55..24:63): toString -> scala/Any#toString().
1676-
[26:6..26:9): foo <- a/b/Givens.foo().
1677-
[26:10..26:11): A <- a/b/Givens.foo().[A]
1678-
[26:19..26:20): A <- a/b/Givens.foo().(A)
1679-
[26:22..26:28): Monoid -> a/b/Givens.Monoid#
1680-
[26:29..26:30): A -> a/b/Givens.foo().[A]
1681-
[26:34..26:35): A -> a/b/Givens.foo().[A]
1682-
[26:38..26:39): A -> a/b/Givens.foo().(A)
1683-
[26:40..26:47): combine -> a/b/Givens.Monoid#combine().
1684-
[26:48..26:49): A -> a/b/Givens.foo().(A)
1685-
[26:50..26:55): empty -> a/b/Givens.Monoid#empty().
1686-
[26:57..26:58): A -> a/b/Givens.foo().(A)
1687-
[26:59..26:64): empty -> a/b/Givens.Monoid#empty().
1734+
[25:8..25:13): apply <- a/b/Givens.int2String#apply().
1735+
[25:14..25:15): x <- a/b/Givens.int2String#apply().(x)
1736+
[25:17..25:20): Int -> scala/Int#
1737+
[25:23..25:29): String -> scala/Predef.String#
1738+
[25:32..25:33): x -> a/b/Givens.int2String#apply().(x)
1739+
[25:34..25:42): toString -> scala/Any#toString().
1740+
[27:6..27:9): foo <- a/b/Givens.foo().
1741+
[27:10..27:11): A <- a/b/Givens.foo().[A]
1742+
[27:19..27:20): A <- a/b/Givens.foo().(A)
1743+
[27:22..27:28): Monoid -> a/b/Givens.Monoid#
1744+
[27:29..27:30): A -> a/b/Givens.foo().[A]
1745+
[27:34..27:35): A -> a/b/Givens.foo().[A]
1746+
[27:38..27:39): A -> a/b/Givens.foo().(A)
1747+
[27:40..27:47): combine -> a/b/Givens.Monoid#combine().
1748+
[27:48..27:49): A -> a/b/Givens.foo().(A)
1749+
[27:50..27:55): empty -> a/b/Givens.Monoid#empty().
1750+
[27:57..27:58): A -> a/b/Givens.foo().(A)
1751+
[27:59..27:64): empty -> a/b/Givens.Monoid#empty().
16881752

16891753
Synthetics:
16901754
[12:17..12:25):sayHello => *[Int]

0 commit comments

Comments
 (0)