diff options
author | Adriaan Moors <adriaan@lightbend.com> | 2016-08-13 08:33:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-13 08:33:25 -0700 |
commit | 3cb45e16cd8c12e4704431f40e4186cc8bd7ed63 (patch) | |
tree | 91f4887985c706e4e093fa892e41e4e53f974c14 /src/reflect | |
parent | d6f601d53e53be6f8071c0646c19b68faac69ec0 (diff) | |
parent | 228d1b1ceb7643df1313672cd620cddb1a429029 (diff) | |
download | scala-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.scala | 11 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeInfo.scala | 6 |
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 { |