summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Namers.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-08-12 15:50:57 -0700
committerAdriaan Moors <adriaan@lightbend.com>2016-08-29 09:52:07 +0200
commit63f7b357f787b96ddf0440c779b1937844cbbb52 (patch)
tree6cf358ade52080214d0d54152e8e890b3ddba6d6 /src/compiler/scala/tools/nsc/typechecker/Namers.scala
parentdf3689139c4d4bcd2933364d13b8195c3433eb43 (diff)
downloadscala-63f7b357f787b96ddf0440c779b1937844cbbb52.tar.gz
scala-63f7b357f787b96ddf0440c779b1937844cbbb52.tar.bz2
scala-63f7b357f787b96ddf0440c779b1937844cbbb52.zip
SI-8873 don't propagate primary ctor arg to case class's apply
Final implementation based on feedback by Jason
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 033b6cc0cd..fe7a4d5fef 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -686,6 +686,8 @@ trait Namers extends MethodSynthesis {
if (name == nme.copy && sym.isSynthetic)
enterCopyMethod(tree)
+ else if (name == nme.apply && sym.hasAllFlags(SYNTHETIC | CASE))
+ sym setInfo caseApplyMethodCompleter(tree, completerOf(tree).asInstanceOf[LockingTypeCompleter])
else
sym setInfo completerOf(tree)
}
@@ -813,6 +815,15 @@ trait Namers extends MethodSynthesis {
classSym setAnnotations (annotations filter annotationFilter(ClassTargetClass, defaultRetention = true))
}
+ def caseApplyMethodCompleter(tree: DefDef, sigCompleter: LockingTypeCompleter) = mkTypeCompleter(tree) { methSym =>
+ sigCompleter.completeImpl(methSym)
+
+ // don't propagate e.g. @volatile annot to apply's argument
+ def retainOnlyParamAnnots(param: Symbol) =
+ param setAnnotations (param.annotations filter AnnotationInfo.mkFilter(ParamTargetClass, defaultRetention = false))
+
+ methSym.info.paramss.foreach(_.foreach(retainOnlyParamAnnots))
+ }
// complete the type of a value definition (may have a method symbol, for those valdefs that never receive a field,
// as specified by Field.noFieldFor)