diff options
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/typechecker/DeSugarize.java | 12 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 12 |
2 files changed, 20 insertions, 4 deletions
diff --git a/sources/scalac/typechecker/DeSugarize.java b/sources/scalac/typechecker/DeSugarize.java index fdf4b0b542..f6f1943e5e 100644 --- a/sources/scalac/typechecker/DeSugarize.java +++ b/sources/scalac/typechecker/DeSugarize.java @@ -165,6 +165,7 @@ public class DeSugarize implements Kinds, Modifiers { /** (x_1: T_1, ..., x_n: T_N) => e ==> * new new scala.Object() with scala.Function[T_1, ..., T_N, T]() { * def apply(x_1: T_1, ..., x_N: T_N): T = e + * def toString(): java.lang.String = "<function>" * } * where T = `restpe' * T_i = `argtpes[i]' @@ -203,8 +204,17 @@ public class DeSugarize implements Kinds, Modifiers { Tree.TypeDef_EMPTY_ARRAY, new ValDef[][]{vparams}, restpe, body); + Tree toStringDef = make.DefDef( + tree.pos, Modifiers.OVERRIDE, Names.toString, + Tree.TypeDef_EMPTY_ARRAY, + new ValDef[][]{Tree.ValDef_EMPTY_ARRAY}, + gen.mkType(tree.pos, global.definitions.JAVA_STRING_TYPE), + make.Literal(tree.pos, "<function>")); + Tree result = make.New(tree.pos, - make.Template(tree.pos, new Tree[]{objConstr, constr}, new Tree[]{applyDef})); + make.Template(tree.pos, + new Tree[]{objConstr, constr}, + new Tree[]{applyDef, toStringDef})); print(tree, "mkfun", result); return result; default: diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 9ea4f125f0..f7e6f3e1d9 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -121,7 +121,9 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { private boolean isGlobalModule(Symbol sym) { return sym.isModule() && - (sym.owner().isPackage() || isGlobalModule(sym.owner().module())); + (sym.owner().isPackage() + //|| isGlobalModule(sym.owner().module()) // add later? translation does not work (yet?) + ); } private Tree[] transformModule(Tree tree, int mods, Name name, Tree tpe, Tree.Template templ) { @@ -190,14 +192,18 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { switch (sym.type()) { case OverloadedType(Symbol[] alts, Type[] alttypes): for (int i = 0; i < alts.length; i++) { - if (alttypes[i].firstParams().length == 0) return alts[i]; + if (isNullaryMethod(alttypes[i])) return alts[i]; } } - assert sym.type().firstParams().length == 0 + assert isNullaryMethod(sym.type()) : "no nullary method " + name + " among " + sym.type() + " at " + site; return sym; } + private boolean isNullaryMethod(Type tp) { + return tp.paramSectionCount() == 1 && tp.firstParams().length == 0; + } + private Symbol getUnaryMemberMethod(Type site, Name name, Type paramtype) { Symbol sym = getMember(site, name); switch (sym.type()) { |