Skip to content

Commit d774f5a

Browse files
committed
better support paths and pattern defs
1 parent 6aea653 commit d774f5a

14 files changed

+174
-106
lines changed

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

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import util.{SourceFile, SourcePosition}
1515
import collection.mutable
1616
import java.nio.file.Paths
1717

18+
import PartialFunction.condOpt
19+
1820
import ast.untpd.given
1921
import NameOps.given
2022

@@ -72,36 +74,40 @@ class ExtractSemanticDB extends Phase with
7274
!sym.exists
7375
|| sym.isLocalDummy
7476
|| sym.is(Synthetic)
75-
|| sym.isConstructor && (sym.owner.is(ModuleClass) || !sym.isGlobal)
7677
|| sym.isSetter
77-
|| excludeDefStrict(sym)
78+
|| excludeDefOrUse(sym)
7879

79-
private def excludeDefStrict(sym: Symbol)(given Context): Boolean =
80+
private def excludeDefOrUse(sym: Symbol)(given Context): Boolean =
8081
sym.name.is(NameKinds.DefaultGetterName)
81-
|| excludeSymbolStrict(sym)
82+
|| sym.isConstructor && (sym.owner.is(ModuleClass) || !sym.isGlobal)
83+
|| excludeSymbol(sym)
8284

83-
private def excludeSymbolStrict(sym: Symbol)(given Context): Boolean =
85+
private def excludeSymbol(sym: Symbol)(given Context): Boolean =
8486
sym.name.isWildcard
85-
|| sym.isAnonymousFunction
87+
|| excludeQual(sym)
88+
89+
private def excludeQual(sym: Symbol)(given Context): Boolean =
90+
sym.isAnonymousFunction
8691
|| sym.isAnonymousModuleVal
8792
|| sym.name.isEmptyNumbered
8893

8994
private def excludeChildren(sym: Symbol)(given Context): Boolean =
9095
sym.isAllOf(HigherKinded | Param)
9196

9297
/** Uses of this symbol where the reference has given span should be excluded from semanticdb */
93-
private def excludeUseStrict(sym: Symbol, span: Span)(given Context): Boolean =
94-
excludeDefStrict(sym)
95-
|| excludeDef(sym) && span.zeroLength
98+
private def excludeUse(qualifier: Option[Symbol], sym: Symbol)(given Context): Boolean =
99+
excludeDefOrUse(sym)
100+
|| sym == defn.Any_typeCast
101+
|| qualifier.exists(excludeQual)
96102

97103
override def traverse(tree: Tree)(given Context): Unit =
98104

99105
inline def traverseCtorParamTpt(ctorSym: Symbol, tpt: Tree): Unit =
100106
val tptSym = tpt.symbol
101107
if tptSym.owner == ctorSym
102108
val found = matchingMemberType(tptSym, ctorSym.owner)
103-
if !excludeUseStrict(found, tpt.span) && tpt.span.hasLength
104-
registerUse(found, tpt.span)
109+
if tpt.span.hasLength
110+
registerUseGuarded(None, found, tpt.span)
105111
else
106112
traverse(tpt)
107113

@@ -129,8 +135,8 @@ class ExtractSemanticDB extends Phase with
129135
registerDefinition(tree.symbol, tree.adjustedNameSpan, symbolKinds(tree))
130136
val privateWithin = tree.symbol.privateWithin
131137
if privateWithin.exists
132-
registerUse(privateWithin, spanOfSymbol(privateWithin, tree.span))
133-
else if !excludeSymbolStrict(tree.symbol)
138+
registerUseGuarded(None, privateWithin, spanOfSymbol(privateWithin, tree.span))
139+
else if !excludeSymbol(tree.symbol)
134140
registerSymbol(tree.symbol, symbolName(tree.symbol), symbolKinds(tree))
135141
tree match
136142
case tree: ValDef
@@ -178,7 +184,8 @@ class ExtractSemanticDB extends Phase with
178184
else
179185
tree.body.foreach(traverse)
180186
case tree: Assign =>
181-
if !excludeUseStrict(tree.lhs.symbol, tree.lhs.span)
187+
val qualSym = condOpt(tree.lhs) { case Select(qual, _) if qual.symbol.exists => qual.symbol }
188+
if !excludeUse(qualSym, tree.lhs.symbol)
182189
val lhs = tree.lhs.symbol
183190
val setter = lhs.matchingSetter.orElse(lhs)
184191
tree.lhs match
@@ -189,24 +196,22 @@ class ExtractSemanticDB extends Phase with
189196
case tree: Ident =>
190197
if tree.name != nme.WILDCARD then
191198
val sym = tree.symbol.adjustIfCtorTyparam
192-
if !excludeUseStrict(sym, tree.span) then
193-
registerUse(sym, tree.span)
199+
registerUseGuarded(None, sym, tree.span)
194200
case tree: Select =>
195201
val qualSpan = tree.qualifier.span
196202
val sym = tree.symbol.adjustIfCtorTyparam
197-
if !excludeUseStrict(sym, tree.span) then
198-
registerUse(sym, adjustSpanToName(tree.span, qualSpan, tree.name))
203+
registerUseGuarded(tree.qualifier.symbol.ifExists, sym, adjustSpanToName(tree.span, qualSpan, tree.name))
199204
if qualSpan.exists && qualSpan.hasLength then
200-
traverseChildren(tree)
205+
traverse(tree.qualifier)
201206
case tree: Import =>
202207
if tree.span.exists && tree.span.hasLength then
203208
for sel <- tree.selectors do
204209
val imported = sel.imported.name
205210
if imported != nme.WILDCARD then
206211
for alt <- tree.expr.tpe.member(imported).alternatives do
207-
registerUse(alt.symbol, sel.imported.span)
212+
registerUseGuarded(None, alt.symbol, sel.imported.span)
208213
if (alt.symbol.companionClass.exists)
209-
registerUse(alt.symbol.companionClass, sel.imported.span)
214+
registerUseGuarded(None, alt.symbol.companionClass, sel.imported.span)
210215
traverseChildren(tree)
211216
case tree: Inlined =>
212217
traverse(tree.call)
@@ -397,9 +402,12 @@ class ExtractSemanticDB extends Phase with
397402
occurrences += occ
398403
generated += occ
399404

405+
private def registerUseGuarded(qualSym: Option[Symbol], sym: Symbol, span: Span)(given Context) =
406+
if !excludeUse(qualSym, sym) then
407+
registerUse(sym, span)
408+
400409
private def registerUse(sym: Symbol, span: Span)(given Context) =
401-
if !excludeUseStrict(sym, span) then
402-
registerOccurrence(symbolName(sym), span, SymbolOccurrence.Role.REFERENCE)
410+
registerOccurrence(symbolName(sym), span, SymbolOccurrence.Role.REFERENCE)
403411

404412
private def registerDefinition(sym: Symbol, span: Span, symkinds: Set[SymbolKind])(given Context) =
405413
val symbol = symbolName(sym)
@@ -496,7 +504,7 @@ class ExtractSemanticDB extends Phase with
496504
vparams <- vparamss
497505
vparam <- vparams
498506
do
499-
if !excludeSymbolStrict(vparam.symbol)
507+
if !excludeSymbol(vparam.symbol)
500508
val symkinds =
501509
getters.get(vparam.name).fold(SymbolKind.emptySet)(getter =>
502510
if getter.mods.is(Mutable) then SymbolKind.VarSet else SymbolKind.ValSet)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ object Scala3 with
9191

9292
given SymbolOps: (sym: Symbol) with
9393

94+
def ifExists(given Context): Option[Symbol] = if sym.exists then Some(sym) else None
95+
9496
def isScala2PackageObject(given Context): Boolean =
9597
sym.name.isScala2PackageObjectName && sym.owner.is(Package) && sym.is(Module)
9698

tests/semanticdb/expect/Annotations.expect.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,33 @@ import com.javacp.annot._
44
import scala.annotation.meta._
55
import scala.language/*->scalaShadowing::language.*/.experimental/*->scalaShadowing::language.experimental.*/.macros/*->scalaShadowing::language.experimental.macros.*/
66

7-
@ClassAnnotation/*->com::javacp::annot::ClassAnnotation#*/
8-
class Annotations/*<-annot::Annotations#*/[@TypeParameterAnnotation/*->com::javacp::annot::TypeParameterAnnotation#*/ T/*<-annot::Annotations#[T]*/](@ParameterAnnotation/*->com::javacp::annot::ParameterAnnotation#*/ x/*<-annot::Annotations#x.*/: T/*->annot::Annotations#[T]*/) { self/*<-local0*/: AnyRef/*->scala::AnyRef#*/ =>
9-
@FieldAnnotation/*->com::javacp::annot::FieldAnnotation#*/
7+
@ClassAnnotation/*->com::javacp::annot::ClassAnnotation#*//*->com::javacp::annot::ClassAnnotation#`<init>`().*/
8+
class Annotations/*<-annot::Annotations#*/[@TypeParameterAnnotation/*->com::javacp::annot::TypeParameterAnnotation#*//*->com::javacp::annot::TypeParameterAnnotation#`<init>`().*/ T/*<-annot::Annotations#[T]*/](@ParameterAnnotation/*->com::javacp::annot::ParameterAnnotation#*//*->com::javacp::annot::ParameterAnnotation#`<init>`().*/ x/*<-annot::Annotations#x.*/: T/*->annot::Annotations#[T]*/) { self/*<-local0*/: AnyRef/*->scala::AnyRef#*/ =>
9+
@FieldAnnotation/*->com::javacp::annot::FieldAnnotation#*//*->com::javacp::annot::FieldAnnotation#`<init>`().*/
1010
val field/*<-annot::Annotations#field.*/ = 42
1111

12-
@MethodAnnotation/*->com::javacp::annot::MethodAnnotation#*/
12+
@MethodAnnotation/*->com::javacp::annot::MethodAnnotation#*//*->com::javacp::annot::MethodAnnotation#`<init>`().*/
1313
def method/*<-annot::Annotations#method().*/ = {
14-
@LocalAnnotation/*->com::javacp::annot::LocalAnnotation#*/
14+
@LocalAnnotation/*->com::javacp::annot::LocalAnnotation#*//*->com::javacp::annot::LocalAnnotation#`<init>`().*/
1515
val local/*<-local1*/ = 42
1616
local/*->local1*/
1717
}
18-
@TypeAnnotation/*->com::javacp::annot::TypeAnnotation#*/
18+
@TypeAnnotation/*->com::javacp::annot::TypeAnnotation#*//*->com::javacp::annot::TypeAnnotation#`<init>`().*/
1919
type S/*<-annot::Annotations#S#*/
2020
}
2121

22-
class B/*<-annot::B#*/ @ConstructorAnnotation/*->com::javacp::annot::ConstructorAnnotation#*/()(x/*<-annot::B#x.*/: Int/*->scala::Int#*/) {
23-
@ConstructorAnnotation/*->com::javacp::annot::ConstructorAnnotation#*/
22+
class B/*<-annot::B#*/ @ConstructorAnnotation/*->com::javacp::annot::ConstructorAnnotation#*//*->com::javacp::annot::ConstructorAnnotation#`<init>`().*/()(x/*<-annot::B#x.*/: Int/*->scala::Int#*/) {
23+
@ConstructorAnnotation/*->com::javacp::annot::ConstructorAnnotation#*//*->com::javacp::annot::ConstructorAnnotation#`<init>`().*/
2424
def this()/*<-annot::B#`<init>`(+1).*/ = this(42)
2525
}
2626

27-
@ObjectAnnotation/*->com::javacp::annot::ObjectAnnotation#*/
27+
@ObjectAnnotation/*->com::javacp::annot::ObjectAnnotation#*//*->com::javacp::annot::ObjectAnnotation#`<init>`().*/
2828
object M/*<-annot::M.*/ {
29-
@MacroAnnotation/*->com::javacp::annot::MacroAnnotation#*/
29+
@MacroAnnotation/*->com::javacp::annot::MacroAnnotation#*//*->com::javacp::annot::MacroAnnotation#`<init>`().*/
3030
def m/*<-annot::M.m().*/[TT/*<-annot::M.m().[TT]*/]: Int/*->scala::Int#*//*->scala::Predef.`???`().*/ = macro ???
3131
}
3232

33-
@TraitAnnotation/*->com::javacp::annot::TraitAnnotation#*/
33+
@TraitAnnotation/*->com::javacp::annot::TraitAnnotation#*//*->com::javacp::annot::TraitAnnotation#`<init>`().*/
3434
trait T/*<-annot::T#*/
3535

3636
object Alias/*<-annot::Alias.*/ {

tests/semanticdb/expect/Enums.expect.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ object Enums/*<-_empty_::Enums.*/ with
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

4949
object <:</*<-_empty_::Enums.`<:<`.*/ with
50-
given [T]: (T/*<-_empty_::Enums.`<:<`.given_T().*//*<-_empty_::Enums.`<:<`.given_T().[T]*//*->_empty_::Enums.`<:<`.given_T().[T]*/ <:</*->_empty_::Enums.`<:<`#*/ T/*->_empty_::Enums.`<:<`.given_T().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*/()
50+
given [T]: (T/*<-_empty_::Enums.`<:<`.given_T().*//*<-_empty_::Enums.`<:<`.given_T().[T]*//*->_empty_::Enums.`<:<`.given_T().[T]*/ <:</*->_empty_::Enums.`<:<`#*/ T/*->_empty_::Enums.`<:<`.given_T().[T]*/) = Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.apply().*/()
5151

5252
def [A, B]/*<-_empty_::Enums.unwrap().*//*<-_empty_::Enums.unwrap().[A]*//*<-_empty_::Enums.unwrap().[B]*/(opt/*<-_empty_::Enums.unwrap().(opt)*/: Option/*->scala::Option#*/[A/*->_empty_::Enums.unwrap().[A]*/]) unwrap(given 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
53-
case Refl/*->_empty_::Enums.`<:<`.Refl.*/() => opt/*->_empty_::Enums.unwrap().(opt)*/.flatMap/*->scala::Option#flatMap().*/(identity/*->scala::Predef.identity().*/[Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]])
53+
case Refl/*->_empty_::Enums.`<:<`.Refl.*//*->_empty_::Enums.`<:<`.Refl.unapply().*/() => opt/*->_empty_::Enums.unwrap().(opt)*/.flatMap/*->scala::Option#flatMap().*/(identity/*->scala::Predef.identity().*//*->local0*/[Option/*->scala::Option#*/[B/*->_empty_::Enums.unwrap().[B]*/]])
5454

55-
val some1/*<-_empty_::Enums.some1.*/ = /*->_empty_::Enums.unwrap().*/Some/*->scala::Some.*/(Some/*->scala::Some.*/(1))/*->_empty_::Enums.`<:<`.given_T().*/.unwrap
55+
val some1/*<-_empty_::Enums.some1.*/ = /*->_empty_::Enums.unwrap().*/Some/*->scala::Some.*//*->scala::Some.apply().*/(Some/*->scala::Some.*//*->scala::Some.apply().*/(1))/*->_empty_::Enums.`<:<`.given_T().*/.unwrap
5656

5757
enum Planet/*<-_empty_::Enums.Planet#*/(mass/*<-_empty_::Enums.Planet#mass.*/: Double/*->scala::Double#*/, radius/*<-_empty_::Enums.Planet#radius.*/: Double/*->scala::Double#*/) extends java.lang.Enum/*->java::lang::Enum#*/[Planet/*->_empty_::Enums.Planet#*/]/*->java::lang::Enum#`<init>`().*/ with
5858
private final val G/*<-_empty_::Enums.Planet#G.*/ = 6.67300E-11
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package example
22

33
class EtaExpansion/*<-example::EtaExpansion#*/ {
4-
Some/*->scala::Some.*/(1).map/*->scala::Option#map().*/(identity/*->scala::Predef.identity().*/)
4+
Some/*->scala::Some.*//*->scala::Some.apply().*/(1).map/*->scala::Option#map().*/(identity/*->scala::Predef.identity().*//*->local0*/)
55
List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1).foldLeft/*->scala::collection::LinearSeqOps#foldLeft().*/("")(_ +/*->java::lang::String#`+`().*/ _)
66
}

tests/semanticdb/expect/ForComprehension.expect.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,38 @@ package example
33
class ForComprehension/*<-example::ForComprehension#*/ {
44
for {
55
a/*<-local0*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1)/*->scala::collection::immutable::List#flatMap().*/
6-
b/*<-local1*//*->local1*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1)/*->scala::collection::IterableOps#withFilter().*/
6+
b/*<-local1*//*->scala::Tuple2.apply().*//*->local1*//*->local3*//*->scala::Tuple2.unapply().*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1)/*->scala::collection::IterableOps#withFilter().*/
77
if b/*->local1*/ >/*->scala::Int#`>`(+3).*/ 1/*->scala::collection::WithFilter#map().*/
88
c/*<-local2*//*->local2*/ = a/*->local0*/ +/*->scala::Int#`+`(+4).*/ b/*->local1*//*->scala::collection::immutable::List#map().*/
9-
} yield (a/*->local0*/, b/*->local1*/, c/*->local2*/)
9+
} yield (/*->scala::Tuple3.apply().*/a/*->local0*/, b/*->local1*/, c/*->local2*/)
1010
for {
1111
a/*<-local4*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(1)/*->scala::collection::immutable::List#flatMap().*/
1212
b/*<-local5*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(a/*->local4*/)/*->scala::collection::IterableOps#withFilter().*/
1313
if (
14-
a/*->local4*/,
14+
/*->scala::Tuple2.apply().*/a/*->local4*/,
1515
b/*->local5*/
16-
) ==/*->scala::Any#`==`().*/ (1, 2)/*->scala::collection::WithFilter#flatMap().*/
17-
(
18-
c/*<-local7*/,
16+
) ==/*->scala::Any#`==`().*/ (/*->scala::Tuple2.apply().*/1, 2)/*->scala::collection::WithFilter#flatMap().*/
17+
/*->local6*//*->scala::Tuple2.unapply().*/(
18+
/*->scala::Tuple2.unapply().*/c/*<-local7*/,
1919
d/*<-local8*/
20-
) <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/((a/*->local4*/, b/*->local5*/))/*->scala::collection::WithFilter#withFilter().*//*->scala::collection::IterableOps#withFilter().*/
20+
) <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/((/*->scala::Tuple2.apply().*/a/*->local4*/, b/*->local5*/))/*->scala::collection::WithFilter#withFilter().*//*->scala::collection::IterableOps#withFilter().*/
2121
if (
22-
a/*->local4*/,
22+
/*->scala::Tuple4.apply().*/a/*->local4*/,
2323
b/*->local5*/,
2424
c/*->local7*/,
2525
d/*->local8*/
26-
) ==/*->scala::Any#`==`().*/ (1, 2, 3, 4)/*->scala::collection::WithFilter#map().*/
27-
e/*<-local9*//*->local9*/ = (
28-
a/*->local4*/,
26+
) ==/*->scala::Any#`==`().*/ (/*->scala::Tuple4.apply().*/1, 2, 3, 4)/*->scala::collection::WithFilter#map().*/
27+
e/*<-local9*//*->scala::Tuple2.apply().*//*->local9*/ = (
28+
/*->scala::Tuple4.apply().*/a/*->local4*/,
2929
b/*->local5*/,
3030
c/*->local7*/,
3131
d/*->local8*/
3232
)/*->scala::collection::IterableOps#withFilter().*/
33-
if e/*->local9*/ ==/*->scala::Any#`==`().*/ (1, 2, 3, 4)/*->scala::collection::WithFilter#flatMap().*/
33+
if e/*->local9*/ ==/*->scala::Any#`==`().*/ (/*->scala::Tuple4.apply().*/1, 2, 3, 4)/*->scala::collection::WithFilter#flatMap().*/
3434
f/*<-local10*/ <- List/*->scala::package.List.*//*->scala::collection::IterableFactory#apply().*/(e/*->local9*/)/*->scala::collection::immutable::List#map().*/
3535
} yield {
3636
(
37-
a/*->local4*/,
37+
/*->scala::Tuple6.apply().*/a/*->local4*/,
3838
b/*->local5*/,
3939
c/*->local7*/,
4040
d/*->local8*/,

tests/semanticdb/expect/Givens.expect.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ package b
44
object Givens/*<-a::b::Givens.*/
55

66
given :[A](any: A)
7-
de/*<-a::b::Givens.given_sayHello_of_A.*//*<-a::b::Givens.given_sayHello_of_A.sayHello().[A]*//*<-a::b::Givens.given_sayHello_of_A.sayHello().(any)*//*->a::b::Givens.given_sayHello_of_A.sayHello().[A]*/f sayHello/*<-a::b::Givens.given_sayHello_of_A.sayHello().*/ = s"Hello, I am $any/*->a::b::Givens.given_sayHello_of_A.sayHello().(any)*//*->scala::StringContext#s().*/"
7+
de/*<-a::b::Givens.given_sayHello_of_A.*//*<-a::b::Givens.given_sayHello_of_A.sayHello().[A]*//*<-a::b::Givens.given_sayHello_of_A.sayHello().(any)*//*->a::b::Givens.given_sayHello_of_A.sayHello().[A]*/f sayHello/*<-a::b::Givens.given_sayHello_of_A.sayHello().*/ = s"/*->scala::StringContext.apply().*/Hello, I am $any/*->a::b::Givens.given_sayHello_of_A.sayHello().(any)*//*->scala::StringContext#s().*/"
88

99
given :[B](any: B)
10-
def /*<-a::b::Givens.given_sayGoodbye_of_B.*//*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().[B]*//*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().[B]*//*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().(any)*//*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().(any)*//*->a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().[B]*//*->a::b::Givens.given_sayGoodbye_of_B.saySoLong().[B]*/sayGoodbye/*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().*/ = s"Goodbye, from $any/*->a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().(any)*//*->scala::StringContext#s().*/"
11-
def saySoLong/*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().*/ = s"So Long, from $any/*->a::b::Givens.given_sayGoodbye_of_B.saySoLong().(any)*//*->scala::StringContext#s().*/"
10+
def /*<-a::b::Givens.given_sayGoodbye_of_B.*//*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().[B]*//*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().[B]*//*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().(any)*//*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().(any)*//*->a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().[B]*//*->a::b::Givens.given_sayGoodbye_of_B.saySoLong().[B]*/sayGoodbye/*<-a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().*/ = s"/*->scala::StringContext.apply().*/Goodbye, from $any/*->a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().(any)*//*->scala::StringContext#s().*/"
11+
def saySoLong/*<-a::b::Givens.given_sayGoodbye_of_B.saySoLong().*/ = s"/*->scala::StringContext.apply().*/So Long, from $any/*->a::b::Givens.given_sayGoodbye_of_B.saySoLong().(any)*//*->scala::StringContext#s().*/"
1212

1313
val hello1/*<-a::b::Givens.hello1.*/ = /*->a::b::Givens.given_sayHello_of_A.sayHello().*/1.sayHello
1414
val goodbye1/*<-a::b::Givens.goodbye1.*/ = /*->a::b::Givens.given_sayGoodbye_of_B.sayGoodbye().*/1.sayGoodbye

0 commit comments

Comments
 (0)