@@ -1285,4 +1285,160 @@ class CompletionTest {
1285
1285
.completion(m2, (" symbol" , Field , " String" ))
1286
1286
}
1287
1287
1288
+ @ Test def refinedNonselectable : Unit = {
1289
+ code """ trait Foo
1290
+ |trait Bar extends Foo
1291
+ |
1292
+ |trait Quux:
1293
+ | def aaa: Foo
1294
+ | def bbb: Foo
1295
+ | def ccc(s: String): String
1296
+ | private def ddd(): Boolean = ???
1297
+ |
1298
+ |val quux = new Quux:
1299
+ | def aaa: Foo = ???
1300
+ | def bbb: Bar = ??? // overriden signature
1301
+ | def ccc(s: String): String = ???
1302
+ | def ccc(i: Int): Int = ??? // overloaded
1303
+ | private def ddd(): Boolean = ???
1304
+ | def eee(): Boolean = ???
1305
+ | private def fff(): Boolean = ???
1306
+ | val ggg: Int = ???
1307
+ |
1308
+ |val a = quux.aa ${m1}
1309
+ |val b = quux.bb ${m2}
1310
+ |val c = quux.cc ${m3}
1311
+ |val d = quux.dd ${m4}
1312
+ |val e = quux.ee ${m5}
1313
+ |val f = quux.ff ${m6}
1314
+ |val g = quux.gg ${m7}
1315
+ |object imported:
1316
+ | import quux.*
1317
+ | val b = bb ${m8}"""
1318
+ .completion(m1, (" aaa" , Method , " => Foo" ))
1319
+ .completion(m2, (" bbb" , Method , " => Bar" ))
1320
+ .completion(m3, (" ccc" , Method , " (s: String): String" ))
1321
+ .noCompletions(m4)
1322
+ .noCompletions(m5)
1323
+ .noCompletions(m6)
1324
+ .noCompletions(m7)
1325
+ .completion(m8, (" bbb" , Method , " => Bar" ))
1326
+ }
1327
+
1328
+ @ Test def refinedSelectable : Unit = {
1329
+ code """ trait Foo
1330
+ |trait Bar extends Foo
1331
+ |
1332
+ |trait Quux extends Selectable:
1333
+ | def aaa: Foo
1334
+ | def bbb: Foo
1335
+ | def ccc(s: String): String
1336
+ | private def ddd(): Boolean = ???
1337
+ |
1338
+ |val quux = new Quux:
1339
+ | def aaa: Foo = ???
1340
+ | def bbb: Bar = ??? // overriden signature
1341
+ | def ccc(s: String): String = ???
1342
+ | def ccc(i: Int): Int = ??? // overloaded
1343
+ | private def ddd(): Boolean = ???
1344
+ | def eee(): Boolean = ???
1345
+ | private def fff(): Boolean = ???
1346
+ | val ggg: Int = ???
1347
+ |
1348
+ |val a = quux.aa ${m1}
1349
+ |val b = quux.bb ${m2}
1350
+ |val c = quux.cc ${m3}
1351
+ |val d = quux.dd ${m4}
1352
+ |val e = quux.ee ${m5}
1353
+ |val f = quux.ff ${m6}
1354
+ |val g = quux.gg ${m7}
1355
+ |object imported:
1356
+ | import quux.*
1357
+ | val b = bb ${m8}"""
1358
+ .completion(m1, (" aaa" , Method , " => Foo" ))
1359
+ .completion(m2, (" bbb" , Method , " => Bar" ))
1360
+ .completion(m3, (" ccc" , Method , " (s: String): String" ), (" ccc" , Method , " (i: Int): Int" ))
1361
+ .noCompletions(m4)
1362
+ .completion(m5, (" eee" , Method , " (): Boolean" ))
1363
+ .noCompletions(m6)
1364
+ .completion(m7, (" ggg" , Field , " Int" ))
1365
+ .completion(m8, (" bbb" , Method , " => Bar" ))
1366
+ }
1367
+
1368
+ @ Test def refinedSelectableFromImplicitConversion : Unit = {
1369
+ code """ case class Wrapper[A](inner: A) extends Selectable
1370
+ |object Wrapper:
1371
+ | implicit def refineWrapper[A](wrapper: Wrapper[A])(using refiner: Refiner[A]): refiner.Refined = ???
1372
+ |
1373
+ |trait Refiner[A]:
1374
+ | type Refined
1375
+ |
1376
+ |case class Foo(name: String)
1377
+ |object Foo:
1378
+ | given Refiner[Foo] with
1379
+ | type Refined = Wrapper[Foo] { def name: String }
1380
+ |
1381
+ |def fooWrapper: Wrapper[Foo] = ???
1382
+ |def name: Wrapper[String] = fooWrapper.na ${m1}"""
1383
+ .completion(m1, Set ((" name" , Method , " => String" )))
1384
+ }
1385
+
1386
+ @ Test def transparentMacro : Unit = {
1387
+ val p1 = Project .withSources(
1388
+ code """ package p1
1389
+ |import scala.quoted.*
1390
+ |
1391
+ |trait Foo:
1392
+ | def xxxa = 0
1393
+ |
1394
+ |class Bar extends Foo:
1395
+ | def xxxb = 1
1396
+ |
1397
+ |transparent inline def bar: Foo = $$ { barImpl }
1398
+ |def barImpl(using Quotes) = '{ new Bar }
1399
+ | """
1400
+ )
1401
+ val p2 = Project .dependingOn(p1).withSources(
1402
+ code """ package p2
1403
+ |val x = p1.bar.xx ${m1}
1404
+ """
1405
+ )
1406
+ withProjects(p1, p2).completion(m1, Set ((" xxxa" , Method , " => Int" ), (" xxxb" , Method , " => Int" )))
1407
+ }
1408
+
1409
+
1410
+ @ Test def implicitlyRefinedWithTransparentMacro : Unit = {
1411
+ val p1 = Project .withSources(
1412
+ code """ package p1
1413
+ |import scala.quoted.*
1414
+ |import scala.language.implicitConversions
1415
+ |
1416
+ |case class Wrapper[A](inner: A) extends Selectable:
1417
+ | def selectDynamic(name: String) = ???
1418
+ |object Wrapper:
1419
+ | implicit def refineWrapper[A](wrapper: Wrapper[A])(using refiner: Refiner[A]): refiner.Refined = ???
1420
+ |
1421
+ |trait Refiner[A]:
1422
+ | type Refined
1423
+ |
1424
+ |case class Foo(name: String)
1425
+ |object Foo:
1426
+ | transparent inline given fooRefiner: Refiner[Foo] = $$ { fooRefinerImpl }
1427
+ |
1428
+ |def fooRefinerImpl(using Quotes): Expr[Refiner[Foo]] = '{
1429
+ | new Refiner[Foo] {
1430
+ | type Refined = Wrapper[Foo] { def name: String }
1431
+ | }
1432
+ |}
1433
+ | """
1434
+ )
1435
+ val p2 = Project .dependingOn(p1).withSources(
1436
+ code """ package p2
1437
+ |import p1.*
1438
+ |def fooWrapper: Wrapper[Foo] = ???
1439
+ |def name = fooWrapper.na ${m1}
1440
+ """
1441
+ )
1442
+ withProjects(p1, p2).completion(m1, Set ((" name" , Method , " => String" )))
1443
+ }
1288
1444
}
0 commit comments