Skip to content

Commit e2f9476

Browse files
authored
Merge pull request scalacenter#390 from sjrd/default-params
Add methods to detect parameters with default values.
2 parents 01f46c9 + fe1398c commit e2f9476

File tree

6 files changed

+44
-3
lines changed

6 files changed

+44
-3
lines changed

tasty-query/shared/src/main/scala/tastyquery/Flags.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ private[tastyquery] object Flags:
5555
val Extension: Flag = newFlag("Extension")
5656
val Final: Flag = newFlag("Final")
5757
val Given: Flag = newFlag("Given")
58+
val HasDefault: Flag = newFlag("HasDefault")
5859
val Implicit: Flag = newFlag("Implicit")
5960
val Infix: Flag = newFlag("Infix")
6061
val Inline: Flag = newFlag("Inline")

tasty-query/shared/src/main/scala/tastyquery/Symbols.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,17 @@ object Symbols {
583583
/** Is this symbol an exporter generated by an `export` statement? */
584584
final def isExport: Boolean = flags.is(Exported)
585585

586+
/** Is this symbol a method with at least one parameter with a default value? */
587+
final def hasParamWithDefault: Boolean =
588+
paramSymss.exists {
589+
case Left(termParams) => termParams.exists(_.isParamWithDefault)
590+
case Right(value) => false
591+
}
592+
end hasParamWithDefault
593+
594+
/** Is this symbol a method parameter with a default value? */
595+
final def isParamWithDefault: Boolean = flags.isAllOf(HasDefault)
596+
586597
/** Get the module class of this module value definition, if it exists:
587598
* - for `object val C` => `object class C[$]`
588599
*/

tasty-query/shared/src/main/scala/tastyquery/reader/pickles/PickleReader.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ private[pickles] class PickleReader {
487487
if pickleFlags.isStable then flags |= StableRealizable
488488
if pickleFlags.isStatic then flags |= Static
489489
if pickleFlags.isCaseAccessor then flags |= CaseAccessor
490-
// if pickleFlags.hasDefault then flags |= HasDefault
490+
if pickleFlags.hasDefault then flags |= HasDefault
491491
if pickleFlags.isTrait then flags |= Trait
492492
// if pickleFlags.isBridge then flags |= Bridge
493493
if pickleFlags.isAccessor then flags |= Accessor

tasty-query/shared/src/main/scala/tastyquery/reader/tasties/TreeUnpickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ private[tasties] class TreeUnpickler private (
312312
case CASEaccessor => addFlag(CaseAccessor)
313313
case COVARIANT => addFlag(Covariant)
314314
case CONTRAVARIANT => addFlag(Contravariant)
315-
case HASDEFAULT => ignoreFlag()
315+
case HASDEFAULT => addFlag(HasDefault)
316316
case STABLE => addFlag(StableRealizable)
317317
case EXTENSION => addFlag(Extension)
318318
case GIVEN => addFlag(Given)

tasty-query/shared/src/test/scala/tastyquery/TypeSuite.scala

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,18 +1051,45 @@ class TypeSuite extends UnrestrictedUnpicklingSuite {
10511051
throw AssertionError(s"unexpected type $tpe")
10521052
}
10531053

1054-
testWithContext("scala-2-default-params") {
1054+
testWithContext("default-params") {
1055+
extension (sym: TermSymbol) def paramCount: Int = sym.declaredType.asInstanceOf[MethodType].paramNames.size
1056+
10551057
val DefaultParamsClass = ctx.findTopLevelClass("simple_trees.DefaultParams")
10561058
assert(clue(DefaultParamsClass.getNonOverloadedDecl(DefaultGetterName(termName("foo"), 0))).isEmpty)
10571059
DefaultParamsClass.findNonOverloadedDecl(DefaultGetterName(termName("foo"), 1))
10581060
DefaultParamsClass.findNonOverloadedDecl(DefaultGetterName(termName("foo"), 2))
10591061
assert(clue(DefaultParamsClass.getNonOverloadedDecl(DefaultGetterName(termName("foo"), 3))).isEmpty)
10601062

1063+
val fooOverloads = DefaultParamsClass.findAllOverloadedDecls(termName("foo"))
1064+
1065+
val fooWithDefaults = fooOverloads.find(_.paramCount == 3).get
1066+
assert(clue(fooWithDefaults.hasParamWithDefault) && !clue(fooWithDefaults.isParamWithDefault))
1067+
val List(Left(fooWithDefaultsParams)) = fooWithDefaults.paramSymss: @unchecked
1068+
assert(clue(fooWithDefaultsParams.map(_.isParamWithDefault)) == List(false, true, true))
1069+
assert(clue(fooWithDefaultsParams.map(_.hasParamWithDefault)).forall(_ == false))
1070+
1071+
for fooOverload <- fooOverloads if fooOverload ne fooWithDefaults do
1072+
assert(!clue(fooOverload.hasParamWithDefault) && !clue(fooOverload.isParamWithDefault))
1073+
val List(Left(params)) = fooOverload.paramSymss: @unchecked
1074+
assert(clue(params.map(_.isParamWithDefault)).forall(_ == false))
1075+
assert(clue(params.map(_.hasParamWithDefault)).forall(_ == false))
1076+
}
1077+
1078+
testWithContext("default-params-scala-2") {
10611079
val IteratorClass = ctx.findTopLevelClass("scala.collection.Iterator")
10621080
assert(clue(IteratorClass.getNonOverloadedDecl(DefaultGetterName(termName("indexWhere"), 0))).isEmpty)
10631081
IteratorClass.findNonOverloadedDecl(DefaultGetterName(termName("indexWhere"), 1))
10641082
assert(clue(IteratorClass.getNonOverloadedDecl(DefaultGetterName(termName("indexWhere"), 2))).isEmpty)
10651083

1084+
locally {
1085+
val indexWhere = IteratorClass.findNonOverloadedDecl(termName("indexWhere"))
1086+
assert(clue(indexWhere.hasParamWithDefault) && !clue(indexWhere.isParamWithDefault))
1087+
1088+
val List(Left(List(p, from))) = indexWhere.paramSymss: @unchecked
1089+
assert(!clue(p.hasParamWithDefault) && !clue(p.isParamWithDefault))
1090+
assert(!clue(from.hasParamWithDefault) && clue(from.isParamWithDefault))
1091+
}
1092+
10661093
val ArrayDequeModClass = ctx.findTopLevelModuleClass("scala.collection.mutable.ArrayDeque")
10671094
ArrayDequeModClass.findNonOverloadedDecl(DefaultGetterName(nme.Constructor, 0))
10681095
assert(clue(ArrayDequeModClass.getNonOverloadedDecl(DefaultGetterName(nme.Constructor, 1))).isEmpty)

test-sources/src/main/scala/simple_trees/DefaultParams.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ package simple_trees
22

33
class DefaultParams:
44
def foo(x: Int, y: Int = 1, z: String = "hello"): String = s"$x $y $z"
5+
6+
def foo(x: Int, y: String): String = s"$x $y"
57
end DefaultParams

0 commit comments

Comments
 (0)