summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-05-19 16:44:34 +0000
committerpaltherr <paltherr@epfl.ch>2003-05-19 16:44:34 +0000
commit7b6a46d75a034d7aeebcaf94c8a6d453a40ed34f (patch)
tree75b0751ed0e4fb8e9971fd73a7934a44e33b7c87 /sources/scalac
parentf5f7f30a43c449d0a16e8840dc20c1e2694c66fa (diff)
downloadscala-7b6a46d75a034d7aeebcaf94c8a6d453a40ed34f.tar.gz
scala-7b6a46d75a034d7aeebcaf94c8a6d453a40ed34f.tar.bz2
scala-7b6a46d75a034d7aeebcaf94c8a6d453a40ed34f.zip
- Moved isGlobalModule method from RefCheck int...
- Moved isGlobalModule method from RefCheck into Symbol Added generation - of module setter method in RefCheck
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/symtab/Symbol.java7
-rw-r--r--sources/scalac/typechecker/RefCheck.java25
2 files changed, 22 insertions, 10 deletions
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index a259e0d62f..1b3ee71659 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -238,6 +238,13 @@ public abstract class Symbol implements Modifiers, Kinds {
return kind == VAL && (flags & MODUL) != 0;
}
+ /** Does this symbol denote a global module? */
+ public final boolean isGlobalModule() {
+ return isModule() && (owner().isPackage()
+ //|| owner().isGlobalModule() // add later? translation does not work (yet?)
+ );
+ }
+
/** Does this symbol denote a module? */
public final boolean isModuleClass() {
return kind == CLASS && (flags & MODUL) != 0;
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index 3b5f7220e5..c40341c1d0 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -121,14 +121,6 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
return stats;
}
- private boolean isGlobalModule(Symbol sym) {
- return
- sym.isModule() &&
- (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) {
Symbol sym = tree.symbol();
Tree cdef = make.ClassDef(
@@ -145,7 +137,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
sym.type().prefix(),
sym.moduleClass(),
Tree.EMPTY_ARRAY);
- if (isGlobalModule(sym)) {
+ if (sym.isGlobalModule()) {
Tree vdef = gen.ValDef(sym, alloc);
return new Tree[]{cdef, vdef};
} else {
@@ -172,7 +164,20 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
sym.updateInfo(Type.PolyType(Symbol.EMPTY_ARRAY, sym.type()));
sym.flags |= STABLE;
Tree ddef = gen.DefDef(sym, body);
- return new Tree[]{cdef, vdef, ddef};
+
+ // def m_eq(m: T): Unit = { m$ = m }
+ Name m_eqname = name.append(Names._EQ);
+ Symbol m_eq = new TermSymbol(
+ tree.pos, m_eqname, sym.owner(), PRIVATE | SYNTHETIC);
+ Symbol m_eqarg = new TermSymbol(tree.pos, name, m_eq, 0)
+ .setType(sym.type());
+ m_eq.setInfo(
+ Type.MethodType(new Symbol[] {m_eqarg}, defs.UNIT_TYPE));
+ Tree m_eqdef = gen.DefDef(m_eq,
+ gen.Assign(gen.mkRef(tree.pos, mvar), gen.Ident(m_eqarg)));
+ sym.owner().members().enterOrOverload(m_eq);
+
+ return new Tree[]{cdef, vdef, ddef, m_eqdef};
}
}