diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-08-17 15:49:38 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-08-18 09:00:55 +0200 |
commit | ac430ac8ba554d1b976d44598400d95ce5cf3816 (patch) | |
tree | 92f709ec56cca5895cd960e82a1ebd10a34ad98a /src/reflect | |
parent | 7fc860963a4f76cb18e44c20f2bdfb49641033f3 (diff) | |
download | scala-ac430ac8ba554d1b976d44598400d95ce5cf3816.tar.gz scala-ac430ac8ba554d1b976d44598400d95ce5cf3816.tar.bz2 scala-ac430ac8ba554d1b976d44598400d95ce5cf3816.zip |
cleanup for macroExpand
Error reporting is moved to ContextErrors to disentangle stuff in Macros.scala.
With logics and error reporting intertwined it was an awful mess.
Exceptions are used for the same reason. Instead of threading failures through
the code polluting it with options/ifs, I outline the success path.
It worked much better for typedMacroBody, but I'm also happy with the resulting
code of macroExpand. To me a major factor towards applicability of exceptions
was that they are short-lived and that there might be max one error per domain,
after which we unconditionally bail.
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeInfo.scala | 11 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Types.scala | 6 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala index 3a6acdcc2b..3a930a195b 100644 --- a/src/reflect/scala/reflect/internal/TreeInfo.scala +++ b/src/reflect/scala/reflect/internal/TreeInfo.scala @@ -603,9 +603,10 @@ abstract class TreeInfo { } } - def stripOffPrefixTypeRefinement(tpe: Type): Type = - tpe.dealias match { - case RefinedType(List(tpe), Scope(sym)) if tpe == MacroContextClass.tpe && sym.allOverriddenSymbols.contains(MacroContextPrefixType) => tpe - case _ => tpe - } + def isNullaryInvocation(tree: Tree): Boolean = + tree.symbol != null && tree.symbol.isMethod && (tree match { + case TypeApply(fun, _) => isNullaryInvocation(fun) + case tree: RefTree => true + case _ => false + }) } diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala index 9514898ce5..52dd4a55cf 100644 --- a/src/reflect/scala/reflect/internal/Types.scala +++ b/src/reflect/scala/reflect/internal/Types.scala @@ -6939,6 +6939,12 @@ trait Types extends api.Types { self: SymbolTable => else (ps :+ SerializableClass.tpe).toList ) + def stripOffPrefixTypeRefinement(tpe: Type): Type = + tpe.dealias match { + case RefinedType(List(tpe), Scope(sym)) if tpe == MacroContextClass.tpe && sym.allOverriddenSymbols.contains(MacroContextPrefixType) => tpe + case _ => tpe + } + def objToAny(tp: Type): Type = if (!phase.erasedTypes && tp.typeSymbol == ObjectClass) AnyClass.tpe else tp |