summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-08-13 08:33:25 -0700
committerGitHub <noreply@github.com>2016-08-13 08:33:25 -0700
commit3cb45e16cd8c12e4704431f40e4186cc8bd7ed63 (patch)
tree91f4887985c706e4e093fa892e41e4e53f974c14 /src/reflect
parentd6f601d53e53be6f8071c0646c19b68faac69ec0 (diff)
parent228d1b1ceb7643df1313672cd620cddb1a429029 (diff)
downloadscala-3cb45e16cd8c12e4704431f40e4186cc8bd7ed63.tar.gz
scala-3cb45e16cd8c12e4704431f40e4186cc8bd7ed63.tar.bz2
scala-3cb45e16cd8c12e4704431f40e4186cc8bd7ed63.zip
Merge pull request #5307 from adriaanm/issue-157
Propagate overloaded function type to expected arg type
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala11
-rw-r--r--src/reflect/scala/reflect/internal/TreeInfo.scala6
2 files changed, 17 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 5025c1fa6d..d0539dfd42 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -687,6 +687,17 @@ trait Definitions extends api.StandardDefinitions {
}
}
+ // the argument types expected by the function described by `tp` (a FunctionN or SAM type),
+ // or `Nil` if `tp` does not represent a function type or SAM (or if it happens to be Function0...)
+ def functionOrSamArgTypes(tp: Type): List[Type] = {
+ val dealiased = tp.dealiasWiden
+ if (isFunctionTypeDirect(dealiased)) dealiased.typeArgs.init
+ else samOf(tp) match {
+ case samSym if samSym.exists => tp.memberInfo(samSym).paramTypes
+ case _ => Nil
+ }
+ }
+
// the SAM's parameters and the Function's formals must have the same length
// (varargs etc don't come into play, as we're comparing signatures, not checking an application)
def samMatchesFunctionBasedOnArity(sam: Symbol, formals: List[Any]): Boolean =
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala
index 86b70643c9..b9f3e987ee 100644
--- a/src/reflect/scala/reflect/internal/TreeInfo.scala
+++ b/src/reflect/scala/reflect/internal/TreeInfo.scala
@@ -263,6 +263,12 @@ abstract class TreeInfo {
true
}
+ def isFunctionMissingParamType(tree: Tree): Boolean = tree match {
+ case Function(vparams, _) => vparams.exists(_.tpt.isEmpty)
+ case _ => false
+ }
+
+
/** Is symbol potentially a getter of a variable?
*/
def mayBeVarGetter(sym: Symbol): Boolean = sym.info match {