Skip to content

Commit a66dd3e

Browse files
Jakub Ciesluktgodzik
authored andcommitted
Better refinement symbols in semanticDB
Previosuly all `Select` on refined types have had symbol from `reflect.Selectable` and their definitions were not global. This change should improve navigation and rename in Metals and allow further changes in presentation compiler module, in order to provide better highlighting and hover
1 parent 5af9339 commit a66dd3e

File tree

11 files changed

+298
-146
lines changed

11 files changed

+298
-146
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import Contexts.*
1212
import Symbols.*
1313
import Flags.*
1414
import Names.Name
15-
import StdNames.nme
15+
import Types._
16+
import StdNames.{nme, tpnme}
1617
import NameOps.*
1718
import Denotations.StaleSymbol
1819
import util.Spans.Span
@@ -379,6 +380,11 @@ object ExtractSemanticDB:
379380
traverseAnnotsOfDefinition(ctorSym)
380381
ctorParams(tree.constr.termParamss, tree.constr.leadingTypeParams, tree.body)
381382
registerDefinition(ctorSym, tree.constr.nameSpan.startPos, Set.empty, tree.source)
383+
case ReflectiveSelectableApply(qual, memberName, sel) =>
384+
traverse(sel.qualifier)
385+
val qualTpe = qual.symbol.info
386+
val member = extractRefinement(qualTpe, memberName)
387+
member.foreach(sym => registerUse(sym.symbolName, sel.nameSpan, tree.source))
382388
case tree: Apply if tree.fun.symbol.exists =>
383389
@tu lazy val genParamSymbol: Name => String = tree.fun.symbol.funParamSymbol
384390
traverse(tree.fun)
@@ -467,6 +473,35 @@ object ExtractSemanticDB:
467473

468474
end traverse
469475

476+
private def extractRefinement(site: Type, memberName: String)(using Context): Option[Symbol] =
477+
def loop(site: Type, owner: Symbol): Option[Symbol] =
478+
site match
479+
case RefinedType(_, name, info) if name.toString() == memberName =>
480+
val flags = info match
481+
case _: (ExprType | MethodOrPoly) => Method
482+
case _ => EmptyFlags
483+
val symbolOwner = newSymbol(owner, tpnme.REFINE_CLASS, Trait, NoType)
484+
val symbol = newSymbol(symbolOwner, name, flags, info)
485+
Some(symbol)
486+
case RefinedType(parent, _, _) => loop(parent, owner)
487+
case tp: ExprType => loop(tp.superType, owner)
488+
case tp: TypeProxy =>
489+
loop(tp.superType, tp.typeSymbol)
490+
case _ =>
491+
None
492+
loop(site, NoSymbol)
493+
494+
private object ReflectiveSelectableApply:
495+
def unapply(tree: Tree)(using Context): Option[(Tree, String, Select)] = tree match
496+
case Apply(
497+
sel @ Select(Apply(Ident(reflSelectable), List(qual)), fun),
498+
Literal(Constants.Constant(memberName: String)) :: args
499+
) if reflSelectable == nme.reflectiveSelectable &&
500+
(fun == nme.selectDynamic || fun == nme.applyDynamic) =>
501+
Some(qual, memberName, sel)
502+
case _ => None
503+
end ReflectiveSelectableApply
504+
470505
private object PatternValDef:
471506

472507
def unapply(tree: ValDef)(using Context): Option[(Tree, Tree)] = tree.rhs match

compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,11 @@ object Scala3:
257257
/** Is symbol global? Non-global symbols get localN names */
258258
def isGlobal(using Context): Boolean =
259259
sym.exists && (
260-
sym.is(Package)
261-
|| !sym.isSelfSym && (sym.is(Param) || sym.owner.isClass) && sym.owner.isGlobal
260+
sym.is(Package) ||
261+
!sym.isSelfSym &&
262+
(sym.is(Param) || sym.owner.isClass ||
263+
sym.owner.isType && !sym.owner.info.hiBound.isMatch) &&
264+
sym.owner.isGlobal
262265
)
263266

264267
def isLocalWithinSameName(using Context): Boolean =

compiler/src/dotty/tools/dotc/semanticdb/SemanticSymbolBuilder.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Contexts.*
77
import Symbols.*
88
import Flags.*
99
import Names.Name
10+
import StdNames.tpnme
1011

1112
import scala.annotation.tailrec
1213
import scala.collection.mutable
@@ -71,7 +72,11 @@ class SemanticSymbolBuilder:
7172
private def addSymName(b: StringBuilder, sym: Symbol)(using Context): Unit =
7273

7374
def addOwner(owner: Symbol): Unit =
74-
if !owner.isRoot then addSymName(b, owner)
75+
if !owner.isRoot then
76+
// Skip synthetic refinement class so refinement members get the type alias as owner
77+
// e.g. User#name(). instead of User#`<refinement>`#name().
78+
if owner.name == tpnme.REFINE_CLASS then addOwner(owner.owner)
79+
else addSymName(b, owner)
7580

7681
def addOverloadIdx(initSym: Symbol): Unit =
7782
// revert from the compiler-generated overload of the signature polymorphic method

tests/semanticdb/expect/Advanced.expect.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,27 @@ class Wildcards/*<-advanced::Wildcards#*/ {
2525
object Test/*<-advanced::Test.*/ {
2626
val s/*<-advanced::Test.s.*/ = new Structural/*->advanced::Structural#*/
2727
val s1/*<-advanced::Test.s1.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/
28-
val s1x/*<-advanced::Test.s1x.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/.x/*->scala::reflect::Selectable#selectDynamic().*/
28+
val s1x/*<-advanced::Test.s1x.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/.x/*->local13*/
2929
val s2/*<-advanced::Test.s2.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/
30-
val s2x/*<-advanced::Test.s2x.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/.x/*->scala::reflect::Selectable#selectDynamic().*/
30+
val s2x/*<-advanced::Test.s2x.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/.x/*->local14*/
3131
val s3/*<-advanced::Test.s3.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/
32-
val s3x/*<-advanced::Test.s3x.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/.m/*->scala::reflect::Selectable#applyDynamic().*/(???/*->scala::Predef.`???`().*/)
32+
val s3x/*<-advanced::Test.s3x.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/.m/*->local15*/(???/*->scala::Predef.`???`().*/)
3333

3434
val e/*<-advanced::Test.e.*/ = new Wildcards/*->advanced::Wildcards#*/
3535
val e1/*<-advanced::Test.e1.*/ = e/*->advanced::Test.e.*/.e1/*->advanced::Wildcards#e1().*/
3636
val e1x/*<-advanced::Test.e1x.*/ = e/*->advanced::Test.e.*/.e1/*->advanced::Wildcards#e1().*/.head/*->scala::collection::IterableOps#head().*/
3737

3838
{
3939
(???/*->scala::Predef.`???`().*/ : Any/*->scala::Any#*/) match {
40-
case e3/*<-local13*/: List/*->scala::package.List#*/[_] =>
41-
val e3x/*<-local15*/ = e3/*->local13*/.head/*->scala::collection::IterableOps#head().*/
40+
case e3/*<-local16*/: List/*->scala::package.List#*/[_] =>
41+
val e3x/*<-local18*/ = e3/*->local16*/.head/*->scala::collection::IterableOps#head().*/
4242
()
4343
}
4444
}
4545

4646
// see: https://github.com/scala/scala3/pull/14608#discussion_r835642563
47-
lazy val foo/*<-advanced::Test.foo.*/: (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local16*/ = Int/*->scala::Int#*/ }) &/*->scala::`&`#*/ (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local17*/ = Int/*->scala::Int#*/; val a/*<-local18*/: A/*->local17*/ }) = ???/*->scala::Predef.`???`().*/
48-
def bar/*<-advanced::Test.bar().*/: foo/*->advanced::Test.foo.*/.A/*->local17*/ = foo/*->advanced::Test.foo.*/.a/*->scala::reflect::Selectable#selectDynamic().*/
47+
lazy val foo/*<-advanced::Test.foo.*/: (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local19*/ = Int/*->scala::Int#*/ }) &/*->scala::`&`#*/ (reflect.Selectable/*->scala::reflect::Selectable#*/ { type A/*<-local20*/ = Int/*->scala::Int#*/; val a/*<-local21*/: A/*->local20*/ }) = ???/*->scala::Predef.`???`().*/
48+
def bar/*<-advanced::Test.bar().*/: foo/*->advanced::Test.foo.*/.A/*->local20*/ = foo/*->advanced::Test.foo.*/.a/*->scala::reflect::Selectable#selectDynamic().*/
4949
}
5050

5151

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
package example
22

3-
def m1/*<-example::RecOrRefined$package.m1().*/(a/*<-example::RecOrRefined$package.m1().(a)*/: Int/*->scala::Int#*/ { val x/*<-local4*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
4-
def m2/*<-example::RecOrRefined$package.m2().*/(x/*<-example::RecOrRefined$package.m2().(x)*/: { val x/*<-local5*/: Int/*->scala::Int#*/; def y/*<-local6*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
5-
def m3/*<-example::RecOrRefined$package.m3().*/(x/*<-example::RecOrRefined$package.m3().(x)*/: { val x/*<-local7*/: Int/*->scala::Int#*/; def y/*<-local8*/: Int/*->scala::Int#*/; type z/*<-local9*/ }) = ???/*->scala::Predef.`???`().*/
3+
def m1/*<-example::RecOrRefined$package.m1().*/(a/*<-example::RecOrRefined$package.m1().(a)*/: Int/*->scala::Int#*/ { val x/*<-local1*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
4+
def m2/*<-example::RecOrRefined$package.m2().*/(x/*<-example::RecOrRefined$package.m2().(x)*/: { val x/*<-local2*/: Int/*->scala::Int#*/; def y/*<-local3*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
5+
def m3/*<-example::RecOrRefined$package.m3().*/(x/*<-example::RecOrRefined$package.m3().(x)*/: { val x/*<-local4*/: Int/*->scala::Int#*/; def y/*<-local5*/: Int/*->scala::Int#*/; type z/*<-local6*/ }) = ???/*->scala::Predef.`???`().*/
66
trait PolyHolder/*<-example::PolyHolder#*/ {
77
def foo/*<-example::PolyHolder#foo().*/[T/*<-example::PolyHolder#foo().[T]*/](t/*<-example::PolyHolder#foo().(t)*/: T/*->example::PolyHolder#foo().[T]*/): Any/*->scala::Any#*/
88
}
99

10-
def m4/*<-example::RecOrRefined$package.m4().*/(x/*<-example::RecOrRefined$package.m4().(x)*/: PolyHolder/*->example::PolyHolder#*/ { def foo/*<-local12*/[T/*<-local10*/](t/*<-local11*/: T/*->local10*/): T/*->local10*/ }) = ???/*->scala::Predef.`???`().*/
11-
def m5/*<-example::RecOrRefined$package.m5().*/[Z/*<-example::RecOrRefined$package.m5().[Z]*/](x/*<-example::RecOrRefined$package.m5().(x)*/: Int/*->scala::Int#*/): PolyHolder/*->example::PolyHolder#*/ { def foo/*<-local15*/[T/*<-local13*/](t/*<-local14*/: T/*->local13*/): T/*->local13*/ } = ???/*->scala::Predef.`???`().*/
10+
def m4/*<-example::RecOrRefined$package.m4().*/(x/*<-example::RecOrRefined$package.m4().(x)*/: PolyHolder/*->example::PolyHolder#*/ { def foo/*<-local9*/[T/*<-local7*/](t/*<-local8*/: T/*->local7*/): T/*->local7*/ }) = ???/*->scala::Predef.`???`().*/
11+
def m5/*<-example::RecOrRefined$package.m5().*/[Z/*<-example::RecOrRefined$package.m5().[Z]*/](x/*<-example::RecOrRefined$package.m5().(x)*/: Int/*->scala::Int#*/): PolyHolder/*->example::PolyHolder#*/ { def foo/*<-local12*/[T/*<-local10*/](t/*<-local11*/: T/*->local10*/): T/*->local10*/ } = ???/*->scala::Predef.`???`().*/
1212

13-
type m6/*<-example::RecOrRefined$package.m6#*/ = [X/*<-example::RecOrRefined$package.m6#[X]*/] =>> PolyHolder/*->example::PolyHolder#*/ { def foo/*<-local18*/[T/*<-local16*/](t/*<-local17*/: T/*->local16*/): T/*->local16*/ }
13+
type m6/*<-example::RecOrRefined$package.m6#*/ = [X/*<-example::RecOrRefined$package.m6#[X]*/] =>> PolyHolder/*->example::PolyHolder#*/ { def foo/*<-example::RecOrRefined$package.m6#foo().*/[T/*<-example::RecOrRefined$package.m6#foo().[T]*/](t/*<-example::RecOrRefined$package.m6#foo().(t)*/: T/*->example::RecOrRefined$package.m6#foo().[T]*/): T/*->example::RecOrRefined$package.m6#foo().[T]*/ }
1414

1515
class Record/*<-example::Record#*/(elems/*<-example::Record#elems.*/: (String/*->scala::Predef.String#*/, Any/*->scala::Any#*/)*) extends Selectable/*->scala::Selectable#*/:
1616
private val fields/*<-example::Record#fields.*/ = elems/*->example::Record#elems.*/.toMap/*->scala::collection::IterableOnceOps#toMap().*/
1717
def selectDynamic/*<-example::Record#selectDynamic().*/(name/*<-example::Record#selectDynamic().(name)*/: String/*->scala::Predef.String#*/): Any/*->scala::Any#*/ = fields/*->example::Record#fields.*/(name/*->example::Record#selectDynamic().(name)*/)
1818

1919
type Person/*<-example::RecOrRefined$package.Person#*/ = Record/*->example::Record#*/ {
20-
val name/*<-local19*/: String/*->scala::Predef.String#*/
21-
val age/*<-local20*/: Int/*->scala::Int#*/
20+
val name/*<-example::RecOrRefined$package.Person#name.*/: String/*->scala::Predef.String#*/
21+
val age/*<-example::RecOrRefined$package.Person#age.*/: Int/*->scala::Int#*/
2222
}
2323

2424
// RecType
2525
class C/*<-example::C#*/ { type T1/*<-example::C#T1#*/; type T2/*<-example::C#T2#*/ }
26-
type C2/*<-example::RecOrRefined$package.C2#*/ = C/*->example::C#*/ { type T1/*<-local21*/; type T2/*<-local22*/ = T1/*->local21*/ }
26+
type C2/*<-example::RecOrRefined$package.C2#*/ = C/*->example::C#*/ { type T1/*<-example::RecOrRefined$package.C2#T1#*/; type T2/*<-example::RecOrRefined$package.C2#T2#*/ = T1/*->example::RecOrRefined$package.C2#T1#*/ }
2727

2828
trait SpecialRefinement/*<-example::SpecialRefinement#*/ {
2929
def pickOne/*<-example::SpecialRefinement#pickOne().*/[T/*<-example::SpecialRefinement#pickOne().[T]*/](as/*<-example::SpecialRefinement#pickOne().(as)*/: T/*->example::SpecialRefinement#pickOne().[T]*/*): Option/*->scala::Option#*/[Any/*->scala::Any#*/]
3030
}
3131

32-
class PickOneRefinement_1/*<-example::PickOneRefinement_1#*/[S/*<-example::PickOneRefinement_1#[S]*/ <: SpecialRefinement/*->example::SpecialRefinement#*/ { def pickOne/*<-local3*/[T/*<-local1*/](as/*<-local2*/: T/*->local1*/*): Option/*->scala::Option#*/[String/*->scala::Predef.String#*/] }] {
32+
class PickOneRefinement_1/*<-example::PickOneRefinement_1#*/[S/*<-example::PickOneRefinement_1#[S]*/ <: SpecialRefinement/*->example::SpecialRefinement#*/ { def pickOne/*<-example::PickOneRefinement_1#`<init>`().[S]pickOne().*/[T/*<-example::PickOneRefinement_1#`<init>`().[S]pickOne().[T]*/](as/*<-example::PickOneRefinement_1#`<init>`().[S]pickOne().(as)*/: T/*->example::PickOneRefinement_1#`<init>`().[S]pickOne().[T]*/*): Option/*->scala::Option#*/[String/*->scala::Predef.String#*/] }] {
3333
def run/*<-example::PickOneRefinement_1#run().*/(s/*<-example::PickOneRefinement_1#run().(s)*/: S/*->example::PickOneRefinement_1#[S]*/, as/*<-example::PickOneRefinement_1#run().(as)*/: String/*->scala::Predef.String#*/*): Option/*->scala::Option#*/[String/*->scala::Predef.String#*/] = s/*->example::PickOneRefinement_1#run().(s)*/.pickOne/*->example::SpecialRefinement#pickOne().*/(as/*->example::PickOneRefinement_1#run().(as)*/:_*)
3434
}

tests/semanticdb/expect/StructuralTypes.expect.scala

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ import reflect.Selectable/*->scala::reflect::Selectable.*/.reflectiveSelectable/
44

55
object StructuralTypes/*<-example::StructuralTypes.*/:
66
type User/*<-example::StructuralTypes.User#*/ = {
7-
def name/*<-local0*/: String/*->scala::Predef.String#*/
8-
def age/*<-local1*/: Int/*->scala::Int#*/
9-
def foo/*<-local3*/(x/*<-local2*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/
7+
def name/*<-example::StructuralTypes.User#name().*/: String/*->scala::Predef.String#*/
8+
def age/*<-example::StructuralTypes.User#age().*/: Int/*->scala::Int#*/
109
}
1110

12-
val user/*<-example::StructuralTypes.user.*/ = null.asInstanceOf/*->scala::Any#asInstanceOf().*/[User/*->example::StructuralTypes.User#*/]
13-
user/*->example::StructuralTypes.user.*/.name/*->scala::reflect::Selectable#selectDynamic().*/
14-
user/*->example::StructuralTypes.user.*/.age/*->scala::reflect::Selectable#selectDynamic().*/
15-
val fooBar/*<-example::StructuralTypes.fooBar.*/ = user/*->example::StructuralTypes.user.*/ foo/*->scala::reflect::Selectable#applyDynamic().*/ 123
11+
type FooUser/*<-example::StructuralTypes.FooUser#*/ = User/*->example::StructuralTypes.User#*/ {
12+
def foo/*<-example::StructuralTypes.FooUser#foo().*/(x/*<-example::StructuralTypes.FooUser#foo().(x)*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/
13+
}
1614

15+
val user/*<-example::StructuralTypes.user.*/ = null.asInstanceOf/*->scala::Any#asInstanceOf().*/[FooUser/*->example::StructuralTypes.FooUser#*/]
16+
user/*->example::StructuralTypes.user.*/.name/*->example::StructuralTypes.User#name().*/
17+
user/*->example::StructuralTypes.user.*/.age/*->example::StructuralTypes.User#age().*/
18+
val fooBar/*<-example::StructuralTypes.fooBar.*/ = user/*->example::StructuralTypes.user.*/ foo/*->example::StructuralTypes.FooUser#foo().*/ 123
1719
val V/*<-example::StructuralTypes.V.*/: Object/*->java::lang::Object#*/ {
18-
def scalameta/*<-local4*/: String/*->scala::Predef.String#*/
19-
} = /*<-local6*/new:
20-
def scalameta/*<-local5*/ = "4.0"
21-
V/*->example::StructuralTypes.V.*/.scalameta/*->scala::reflect::Selectable#selectDynamic().*/
20+
def scalameta/*<-local0*/: String/*->scala::Predef.String#*/
21+
} = /*<-local2*/new:
22+
def scalameta/*<-local1*/ = "4.0"
23+
V/*->example::StructuralTypes.V.*/.scalameta/*->local4*/
2224
end StructuralTypes/*->example::StructuralTypes.*/

tests/semanticdb/expect/StructuralTypes.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@ object StructuralTypes:
66
type User = {
77
def name: String
88
def age: Int
9+
}
10+
11+
type FooUser = User {
912
def foo(x: Int): Int
1013
}
1114

12-
val user = null.asInstanceOf[User]
15+
val user = null.asInstanceOf[FooUser]
1316
user.name
1417
user.age
1518
val fooBar = user foo 123
16-
1719
val V: Object {
1820
def scalameta: String
1921
} = new:
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package example
2+
3+
import reflect.Selectable/*->scala::reflect::Selectable.*/.reflectiveSelectable/*->scala::reflect::Selectable.reflectiveSelectable().*/
4+
5+
object StructuralTypesParams/*<-example::StructuralTypesParams.*/:
6+
type User/*<-example::StructuralTypesParams.User#*/ = {
7+
def foo/*<-example::StructuralTypesParams.User#foo().*/(arg1/*<-example::StructuralTypesParams.User#foo().(arg1)*/: Int/*->scala::Int#*/, arg2/*<-example::StructuralTypesParams.User#foo().(arg2)*/: String/*->scala::Predef.String#*/): String/*->scala::Predef.String#*/
8+
def age/*<-example::StructuralTypesParams.User#age().*/: Int/*->scala::Int#*/
9+
10+
}
11+
val user/*<-example::StructuralTypesParams.user.*/ = null.asInstanceOf/*->scala::Any#asInstanceOf().*/[User/*->example::StructuralTypesParams.User#*/]
12+
val num/*<-example::StructuralTypesParams.num.*/ = 123
13+
val str/*<-example::StructuralTypesParams.str.*/ = "abc"
14+
val fooBar/*<-example::StructuralTypesParams.fooBar.*/ = user/*->example::StructuralTypesParams.user.*/.foo/*->example::StructuralTypesParams.User#foo().*/(num/*->example::StructuralTypesParams.num.*/, str/*->example::StructuralTypesParams.str.*/)
15+
val fooBaz/*<-example::StructuralTypesParams.fooBaz.*/ = user/*->example::StructuralTypesParams.user.*/.foo/*->example::StructuralTypesParams.User#foo().*/(arg1 = num/*->example::StructuralTypesParams.num.*/, arg2 = str/*->example::StructuralTypesParams.str.*/)
16+
val age/*<-example::StructuralTypesParams.age.*/ = user/*->example::StructuralTypesParams.user.*/.age/*->example::StructuralTypesParams.User#age().*/
17+
18+
end StructuralTypesParams/*->example::StructuralTypesParams.*/
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package example
2+
3+
import reflect.Selectable.reflectiveSelectable
4+
5+
object StructuralTypesParams:
6+
type User = {
7+
def foo(arg1: Int, arg2: String): String
8+
def age: Int
9+
10+
}
11+
val user = null.asInstanceOf[User]
12+
val num = 123
13+
val str = "abc"
14+
val fooBar = user.foo(num, str)
15+
val fooBaz = user.foo(arg1 = num, arg2 = str)
16+
val age = user.age
17+
18+
end StructuralTypesParams
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
object Test_depmatch/*<-_empty_::Test_depmatch.*/ {
2-
type Foo/*<-_empty_::Test_depmatch.Foo#*/ = Int/*->scala::Int#*/ { type U/*<-local0*/ }
2+
type Foo/*<-_empty_::Test_depmatch.Foo#*/ = Int/*->scala::Int#*/ { type U/*<-_empty_::Test_depmatch.Foo#U#*/ }
33
type Bar/*<-_empty_::Test_depmatch.Bar#*/[T/*<-_empty_::Test_depmatch.Bar#[T]*/] = T/*->_empty_::Test_depmatch.Bar#[T]*/ match {
44
case Unit/*->scala::Unit#*/ => Unit/*->scala::Unit#*/
55
}
66
inline def baz/*<-_empty_::Test_depmatch.baz().*/(foo/*<-_empty_::Test_depmatch.baz().(foo)*/: Foo/*->_empty_::Test_depmatch.Foo#*/): Unit/*->scala::Unit#*/ = {
7-
val v/*<-local1*/: Bar/*->_empty_::Test_depmatch.Bar#*/[foo/*->_empty_::Test_depmatch.baz().(foo)*/.U/*->local0*/] = ???/*->scala::Predef.`???`().*/
7+
val v/*<-local0*/: Bar/*->_empty_::Test_depmatch.Bar#*/[foo/*->_empty_::Test_depmatch.baz().(foo)*/.U/*->_empty_::Test_depmatch.Foo#U#*/] = ???/*->scala::Predef.`???`().*/
88
}
99
}

0 commit comments

Comments
 (0)