summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/typechecker/DeSugarize.java12
-rw-r--r--sources/scalac/typechecker/RefCheck.java12
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()) {