diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-06-05 16:51:06 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-06-07 22:26:56 +0200 |
commit | ee646e9c84290e721c4ee9fe6247d4b95840e871 (patch) | |
tree | 9e95db43b84677f0f874d9e0f6c584ad2c49259c /src | |
parent | 488444b327f222fa4ef317b5d96fb7cdf732d4d2 (diff) | |
download | scala-ee646e9c84290e721c4ee9fe6247d4b95840e871.tar.gz scala-ee646e9c84290e721c4ee9fe6247d4b95840e871.tar.bz2 scala-ee646e9c84290e721c4ee9fe6247d4b95840e871.zip |
fixes a crash on a degenerate macro definition
Previous version of the MacroImplReference extractor didn't take into
the account the fact that RefTree.qualifier.symbol can be null (and it can
be null if RefTree is an Ident, because then qualifier is an EmptyTree).
This led to NPEs for really weird macro defs that refer to local methods
as their corresponding macro impls. Now I check for this corner case,
and the stuff now longer crashes.
This was wrong; this is how I fixed it; the world is now a better place.
Diffstat (limited to 'src')
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeInfo.scala | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala index d1e8a04553..3a8d3fd460 100644 --- a/src/reflect/scala/reflect/internal/TreeInfo.scala +++ b/src/reflect/scala/reflect/internal/TreeInfo.scala @@ -837,11 +837,12 @@ abstract class TreeInfo { def unapply(tree: Tree) = refPart(tree) match { case ref: RefTree => { - val isBundle = definitions.isMacroBundleType(ref.qualifier.tpe) + val qual = ref.qualifier + val isBundle = definitions.isMacroBundleType(qual.tpe) val owner = - if (isBundle) ref.qualifier.tpe.typeSymbol + if (isBundle) qual.tpe.typeSymbol else { - val sym = ref.qualifier.symbol + val sym = if (qual.hasSymbolField) qual.symbol else NoSymbol if (sym.isModule) sym.moduleClass else sym } Some((isBundle, owner, ref.symbol, dissectApplied(tree).targs)) |