Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ import ast.Trees.{mods, WithEndMarker}
import Contexts._
import Symbols._
import Flags._
import Names.Name
import StdNames.nme
import Names.{Name, termName}
import StdNames.{nme, tpnme}
import Types._
import NameOps._
import Denotations.StaleSymbol
import util.Spans.Span
Expand Down Expand Up @@ -209,6 +210,11 @@ class ExtractSemanticDB extends Phase:
traverseAnnotsOfDefinition(ctorSym)
ctorParams(tree.constr.termParamss, tree.constr.leadingTypeParams, tree.body)
registerDefinition(ctorSym, tree.constr.nameSpan.startPos, Set.empty, tree.source)
case ReflectiveSelectableApply(qual, memberName, sel) =>
traverse(sel.qualifier)
val qualTpe = qual.symbol.info
val member = extractRefinement(qualTpe, memberName)
member.foreach(sym => registerUse(sym.symbolName, sel.nameSpan, tree.source))
case tree: Apply =>
@tu lazy val genParamSymbol: Name => String = tree.fun.symbol.funParamSymbol
traverse(tree.fun)
Expand Down Expand Up @@ -291,6 +297,35 @@ class ExtractSemanticDB extends Phase:

end traverse

private def extractRefinement(site: Type, memberName: String)(using Context): Option[Symbol] =
def loop(site: Type, owner: Symbol): Option[Symbol] =
site match
case RefinedType(_, name, info) if name.toString() == memberName =>
val flags = info match
case _: (ExprType | MethodOrPoly) => Method
case _ => EmptyFlags
val symbolOwner = newSymbol(owner, tpnme.REFINE_CLASS, Trait, NoType)
val symbol = newSymbol(symbolOwner, name, flags, info)
Some(symbol)
case RefinedType(parent, _, _) => loop(parent, owner)
case tp: ExprType => loop(tp.superType, owner)
case tp: TypeProxy =>
loop(tp.superType, tp.typeSymbol)
case _ =>
None
loop(site, NoSymbol)

private object ReflectiveSelectableApply:
def unapply(tree: Tree)(using Context): Option[(Tree, String, Select)] = tree match
case Apply(
sel @ Select(Apply(Ident(reflSelectable), List(qual)), fun),
Literal(Constants.Constant(memberName: String)) :: args
) if reflSelectable == nme.reflectiveSelectable &&
(fun == nme.selectDynamic || fun == nme.applyDynamic) =>
Some(qual, memberName, sel)
case _ => None
end ReflectiveSelectableApply

private object PatternValDef:

def unapply(tree: ValDef)(using Context): Option[(Tree, Tree)] = tree.rhs match
Expand Down
7 changes: 5 additions & 2 deletions compiler/src/dotty/tools/dotc/semanticdb/Scala3.scala
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,11 @@ object Scala3:
/** Is symbol global? Non-global symbols get localN names */
def isGlobal(using Context): Boolean =
sym.exists && (
sym.is(Package)
|| !sym.isSelfSym && (sym.is(Param) || sym.owner.isClass) && sym.owner.isGlobal
sym.is(Package) ||
!sym.isSelfSym &&
(sym.is(Param) || sym.owner.isClass ||
sym.owner.isType && !sym.owner.info.hiBound.isMatch) &&
sym.owner.isGlobal
)

def isLocalWithinSameName(using Context): Boolean =
Expand Down
14 changes: 7 additions & 7 deletions tests/semanticdb/expect/Advanced.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,27 @@ class Wildcards/*<-advanced::Wildcards#*/ {
object Test/*<-advanced::Test.*/ {
val s/*<-advanced::Test.s.*/ = new Structural/*->advanced::Structural#*/
val s1/*<-advanced::Test.s1.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/
val s1x/*<-advanced::Test.s1x.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/.x/*->scala::reflect::Selectable#selectDynamic().*/
val s1x/*<-advanced::Test.s1x.*/ = s/*->advanced::Test.s.*/.s1/*->advanced::Structural#s1().*/.x/*->local13*/
val s2/*<-advanced::Test.s2.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/
val s2x/*<-advanced::Test.s2x.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/.x/*->scala::reflect::Selectable#selectDynamic().*/
val s2x/*<-advanced::Test.s2x.*/ = s/*->advanced::Test.s.*/.s2/*->advanced::Structural#s2().*/.x/*->local14*/
val s3/*<-advanced::Test.s3.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/
val s3x/*<-advanced::Test.s3x.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/.m/*->scala::reflect::Selectable#applyDynamic().*/(???/*->scala::Predef.`???`().*/)
val s3x/*<-advanced::Test.s3x.*/ = s/*->advanced::Test.s.*/.s3/*->advanced::Structural#s3().*/.m/*->local15*/(???/*->scala::Predef.`???`().*/)

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

{
(???/*->scala::Predef.`???`().*/ : Any/*->scala::Any#*/) match {
case e3/*<-local13*/: List/*->scala::package.List#*/[_] =>
val e3x/*<-local15*/ = e3/*->local13*/.head/*->scala::collection::IterableOps#head().*/
case e3/*<-local16*/: List/*->scala::package.List#*/[_] =>
val e3x/*<-local18*/ = e3/*->local16*/.head/*->scala::collection::IterableOps#head().*/
()
}
}

// see: https://github.com/lampepfl/dotty/pull/14608#discussion_r835642563
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.`???`().*/
def bar/*<-advanced::Test.bar().*/: foo/*->advanced::Test.foo.*/.A/*->local17*/ = foo/*->advanced::Test.foo.*/.a/*->scala::reflect::Selectable#selectDynamic().*/
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.`???`().*/
def bar/*<-advanced::Test.bar().*/: foo/*->advanced::Test.foo.*/.A/*->local20*/ = foo/*->advanced::Test.foo.*/.a/*->scala::reflect::Selectable#selectDynamic().*/
}


Expand Down
20 changes: 10 additions & 10 deletions tests/semanticdb/expect/RecOrRefined.expect.scala
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
package example

def m1/*<-example::RecOrRefined$package.m1().*/(a/*<-example::RecOrRefined$package.m1().(a)*/: Int/*->scala::Int#*/ { val x/*<-local4*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
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.`???`().*/
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.`???`().*/
def m1/*<-example::RecOrRefined$package.m1().*/(a/*<-example::RecOrRefined$package.m1().(a)*/: Int/*->scala::Int#*/ { val x/*<-local1*/: Int/*->scala::Int#*/ }) = ???/*->scala::Predef.`???`().*/
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.`???`().*/
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.`???`().*/
trait PolyHolder/*<-example::PolyHolder#*/ {
def foo/*<-example::PolyHolder#foo().*/[T/*<-example::PolyHolder#foo().[T]*/](t/*<-example::PolyHolder#foo().(t)*/: T/*->example::PolyHolder#foo().[T]*/): Any/*->scala::Any#*/
}

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.`???`().*/
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.`???`().*/
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.`???`().*/
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.`???`().*/

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*/ }
type m6/*<-example::RecOrRefined$package.m6#*/ = [X/*<-example::RecOrRefined$package.m6#[X]*/] =>> PolyHolder/*->example::PolyHolder#*/ { def foo/*<-example::RecOrRefined$package.m6#`<refinement>`#foo().*/[T/*<-example::RecOrRefined$package.m6#`<refinement>`#foo().[T]*/](t/*<-example::RecOrRefined$package.m6#`<refinement>`#foo().(t)*/: T/*->example::RecOrRefined$package.m6#`<refinement>`#foo().[T]*/): T/*->example::RecOrRefined$package.m6#`<refinement>`#foo().[T]*/ }

class Record/*<-example::Record#*/(elems/*<-example::Record#elems.*/: (String/*->scala::Predef.String#*/, Any/*->scala::Any#*/)*) extends Selectable/*->scala::Selectable#*/:
private val fields/*<-example::Record#fields.*/ = elems/*->example::Record#elems.*/.toMap/*->scala::collection::IterableOnceOps#toMap().*/
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)*/)

type Person/*<-example::RecOrRefined$package.Person#*/ = Record/*->example::Record#*/ {
val name/*<-local19*/: String/*->scala::Predef.String#*/
val age/*<-local20*/: Int/*->scala::Int#*/
val name/*<-example::RecOrRefined$package.Person#`<refinement>`#name.*/: String/*->scala::Predef.String#*/
val age/*<-example::RecOrRefined$package.Person#`<refinement>`#age.*/: Int/*->scala::Int#*/
}

// RecType
class C/*<-example::C#*/ { type T1/*<-example::C#T1#*/; type T2/*<-example::C#T2#*/ }
type C2/*<-example::RecOrRefined$package.C2#*/ = C/*->example::C#*/ { type T1/*<-local21*/; type T2/*<-local22*/ = T1/*->local21*/ }
type C2/*<-example::RecOrRefined$package.C2#*/ = C/*->example::C#*/ { type T1/*<-example::RecOrRefined$package.C2#`<refinement>`#T1#*/; type T2/*<-example::RecOrRefined$package.C2#`<refinement>`#T2#*/ = T1/*->example::RecOrRefined$package.C2#`<refinement>`#T1#*/ }

trait SpecialRefinement/*<-example::SpecialRefinement#*/ {
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#*/]
}

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#*/] }] {
class PickOneRefinement_1/*<-example::PickOneRefinement_1#*/[S/*<-example::PickOneRefinement_1#[S]*/ <: SpecialRefinement/*->example::SpecialRefinement#*/ { def pickOne/*<-example::PickOneRefinement_1#`<init>`().[S]`<refinement>`#pickOne().*/[T/*<-example::PickOneRefinement_1#`<init>`().[S]`<refinement>`#pickOne().[T]*/](as/*<-example::PickOneRefinement_1#`<init>`().[S]`<refinement>`#pickOne().(as)*/: T/*->example::PickOneRefinement_1#`<init>`().[S]`<refinement>`#pickOne().[T]*/*): Option/*->scala::Option#*/[String/*->scala::Predef.String#*/] }] {
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)*/:_*)
}
24 changes: 13 additions & 11 deletions tests/semanticdb/expect/StructuralTypes.expect.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@ import reflect.Selectable/*->scala::reflect::Selectable.*/.reflectiveSelectable/

object StructuralTypes/*<-example::StructuralTypes.*/:
type User/*<-example::StructuralTypes.User#*/ = {
def name/*<-local0*/: String/*->scala::Predef.String#*/
def age/*<-local1*/: Int/*->scala::Int#*/
def foo/*<-local3*/(x/*<-local2*/: Int/*->scala::Int#*/): Int/*->scala::Int#*/
def name/*<-example::StructuralTypes.User#`<refinement>`#name().*/: String/*->scala::Predef.String#*/
def age/*<-example::StructuralTypes.User#`<refinement>`#age().*/: Int/*->scala::Int#*/
}

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

val user/*<-example::StructuralTypes.user.*/ = null.asInstanceOf/*->scala::Any#asInstanceOf().*/[FooUser/*->example::StructuralTypes.FooUser#*/]
user/*->example::StructuralTypes.user.*/.name/*->example::StructuralTypes.User#`<refinement>`#name().*/
user/*->example::StructuralTypes.user.*/.age/*->example::StructuralTypes.User#`<refinement>`#age().*/
val fooBar/*<-example::StructuralTypes.fooBar.*/ = user/*->example::StructuralTypes.user.*/ foo/*->example::StructuralTypes.FooUser#`<refinement>`#foo().*/ 123
val V/*<-example::StructuralTypes.V.*/: Object/*->java::lang::Object#*/ {
def scalameta/*<-local4*/: String/*->scala::Predef.String#*/
} = /*<-local6*/new:
def scalameta/*<-local5*/ = "4.0"
V/*->example::StructuralTypes.V.*/.scalameta/*->scala::reflect::Selectable#selectDynamic().*/
def scalameta/*<-local0*/: String/*->scala::Predef.String#*/
} = /*<-local2*/new:
def scalameta/*<-local1*/ = "4.0"
V/*->example::StructuralTypes.V.*/.scalameta/*->local4*/
end StructuralTypes/*->example::StructuralTypes.*/
6 changes: 4 additions & 2 deletions tests/semanticdb/expect/StructuralTypes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ object StructuralTypes:
type User = {
def name: String
def age: Int
}

type FooUser = User {
def foo(x: Int): Int
}

val user = null.asInstanceOf[User]
val user = null.asInstanceOf[FooUser]
user.name
user.age
val fooBar = user foo 123

val V: Object {
def scalameta: String
} = new:
Expand Down
18 changes: 18 additions & 0 deletions tests/semanticdb/expect/StructuralTypesParams.expect.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package example

import reflect.Selectable/*->scala::reflect::Selectable.*/.reflectiveSelectable/*->scala::reflect::Selectable.reflectiveSelectable().*/

object StructuralTypesParams/*<-example::StructuralTypesParams.*/:
type User/*<-example::StructuralTypesParams.User#*/ = {
def foo/*<-example::StructuralTypesParams.User#`<refinement>`#foo().*/(arg1/*<-example::StructuralTypesParams.User#`<refinement>`#foo().(arg1)*/: Int/*->scala::Int#*/, arg2/*<-example::StructuralTypesParams.User#`<refinement>`#foo().(arg2)*/: String/*->scala::Predef.String#*/): String/*->scala::Predef.String#*/
def age/*<-example::StructuralTypesParams.User#`<refinement>`#age().*/: Int/*->scala::Int#*/

}
val user/*<-example::StructuralTypesParams.user.*/ = null.asInstanceOf/*->scala::Any#asInstanceOf().*/[User/*->example::StructuralTypesParams.User#*/]
val num/*<-example::StructuralTypesParams.num.*/ = 123
val str/*<-example::StructuralTypesParams.str.*/ = "abc"
val fooBar/*<-example::StructuralTypesParams.fooBar.*/ = user/*->example::StructuralTypesParams.user.*/.foo/*->example::StructuralTypesParams.User#`<refinement>`#foo().*/(num/*->example::StructuralTypesParams.num.*/, str/*->example::StructuralTypesParams.str.*/)
val fooBaz/*<-example::StructuralTypesParams.fooBaz.*/ = user/*->example::StructuralTypesParams.user.*/.foo/*->example::StructuralTypesParams.User#`<refinement>`#foo().*/(arg1 = num/*->example::StructuralTypesParams.num.*/, arg2 = str/*->example::StructuralTypesParams.str.*/)
val age/*<-example::StructuralTypesParams.age.*/ = user/*->example::StructuralTypesParams.user.*/.age/*->example::StructuralTypesParams.User#`<refinement>`#age().*/

end StructuralTypesParams/*->example::StructuralTypesParams.*/
18 changes: 18 additions & 0 deletions tests/semanticdb/expect/StructuralTypesParams.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package example

import reflect.Selectable.reflectiveSelectable

object StructuralTypesParams:
type User = {
def foo(arg1: Int, arg2: String): String
def age: Int

}
val user = null.asInstanceOf[User]
val num = 123
val str = "abc"
val fooBar = user.foo(num, str)
val fooBaz = user.foo(arg1 = num, arg2 = str)
val age = user.age

end StructuralTypesParams
4 changes: 2 additions & 2 deletions tests/semanticdb/expect/dep-match.expect.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
object Test_depmatch/*<-_empty_::Test_depmatch.*/ {
type Foo/*<-_empty_::Test_depmatch.Foo#*/ = Int/*->scala::Int#*/ { type U/*<-local0*/ }
type Foo/*<-_empty_::Test_depmatch.Foo#*/ = Int/*->scala::Int#*/ { type U/*<-_empty_::Test_depmatch.Foo#`<refinement>`#U#*/ }
type Bar/*<-_empty_::Test_depmatch.Bar#*/[T/*<-_empty_::Test_depmatch.Bar#[T]*/] = T/*->_empty_::Test_depmatch.Bar#[T]*/ match {
case Unit/*->scala::Unit#*/ => Unit/*->scala::Unit#*/
}
inline def baz/*<-_empty_::Test_depmatch.baz().*/(foo/*<-_empty_::Test_depmatch.baz().(foo)*/: Foo/*->_empty_::Test_depmatch.Foo#*/): Unit/*->scala::Unit#*/ = {
val v/*<-local1*/: Bar/*->_empty_::Test_depmatch.Bar#*/[foo/*->_empty_::Test_depmatch.baz().(foo)*/.U/*->local0*/] = ???/*->scala::Predef.`???`().*/
val v/*<-local0*/: Bar/*->_empty_::Test_depmatch.Bar#*/[foo/*->_empty_::Test_depmatch.baz().(foo)*/.U/*->_empty_::Test_depmatch.Foo#`<refinement>`#U#*/] = ???/*->scala::Predef.`???`().*/
}
}
Loading