summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2004-03-11 16:06:26 +0000
committerpaltherr <paltherr@epfl.ch>2004-03-11 16:06:26 +0000
commit247c8b081ebd4ad2f2afbe473e211bf25dd0b327 (patch)
treea1366f881d9c9c84ddcee6014f336a7885746ae0 /sources
parentb40e2e68797687d4cd5b6c1bf9e69714e7983feb (diff)
downloadscala-247c8b081ebd4ad2f2afbe473e211bf25dd0b327.tar.gz
scala-247c8b081ebd4ad2f2afbe473e211bf25dd0b327.tar.bz2
scala-247c8b081ebd4ad2f2afbe473e211bf25dd0b327.zip
- Forced all class creators to use factory meth...
- Forced all class creators to use factory methods in Symbol Moved - ClassSymbol.define into Analyzer
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala22
-rw-r--r--sources/scalac/symtab/Symbol.java40
2 files changed, 28 insertions, 34 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
index b0ca4207ff..a0f85befa3 100644
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala
@@ -718,6 +718,25 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
p
}
+ def classSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
+ val entry = scope.lookupEntry(name);
+ val clazz = entry.sym;
+ if (entry.owner == scope && clazz.isExternal() && clazz.isClassType()) {
+ updateFlags(clazz, flags);
+ clazz.pos = pos;
+ clazz.allConstructors().pos = pos;
+ clazz
+ } else {
+ owner.newClass(pos, flags, name)
+ }
+ }
+
+ def updateFlags(symbol: Symbol, flags: int): unit = {
+ val oldflags = symbol.flags & (INITIALIZED | LOCKED);
+ val newflags = flags & ~(INITIALIZED | LOCKED);
+ symbol.flags = oldflags | newflags;
+ }
+
/** Enter symbol `sym' in current scope. Check for double definitions.
* Handle overloading.
*/
@@ -843,8 +862,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(
sym
case Tree$ClassDef(mods, name, tparams, vparams, _, templ) =>
- val clazz: ClassSymbol = ClassSymbol.define(
- tree.pos, name, owner, mods, context.scope);
+ val clazz = classSymbol(tree.pos, name, owner, mods, context.scope);
if (!clazz.primaryConstructor().isInitialized())
clazz.primaryConstructor().setInfo(new LazyTreeType(tree));
if ((mods & CASE) != 0) {
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index 62a143c45e..e935eb27e6 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -1705,9 +1705,8 @@ public class AbsTypeSymbol extends TypeSymbol {
}
-/** A class for class symbols. It has JavaClassSymbol as a subclass.
- */
-public class ClassSymbol extends TypeSymbol {
+/** A class for class symbols. */
+public final class ClassSymbol extends TypeSymbol {
/**
* The dual class of this class or NONE. The dual class is:
@@ -1716,12 +1715,8 @@ public class ClassSymbol extends TypeSymbol {
*/
private final Symbol dual;
- /** The module belonging to the class. This means:
- * For Java classes, its statics parts.
- * For module classes, the corresponding module.
- * For other classes, null.
- */
- private Symbol module = NONE;
+ /** The module belonging to the class or NONE. */
+ private final Symbol module;
/** The given type of self, or NoType, if no explicit type was given.
*/
@@ -1735,14 +1730,7 @@ public class ClassSymbol extends TypeSymbol {
private final Symbol rebindSym;
- /** Principal Constructor
- */
- public ClassSymbol(int pos, Name name, Symbol owner, int flags) {
- this(pos, name, owner, flags, 0);
- }
- public ClassSymbol(int pos, Name name, Symbol owner, int flags, int attrs) {
- this(pos, name, owner, flags, attrs, NONE);
- }
+ /** Initializes this instance. */
ClassSymbol(int pos, Name name, Symbol owner, int flags, int attrs, Symbol dual) {
super(CLASS, pos, name, owner, flags, attrs);
this.rebindSym = new AliasTypeSymbol(pos, Names.ALIAS(this), owner, 0);
@@ -1768,18 +1756,6 @@ public class ClassSymbol extends TypeSymbol {
}
}
- public static ClassSymbol define(
- int pos, Name name, Symbol owner, int flags, Scope scope) {
- Scope.Entry e = scope.lookupEntry(name);
- if (e.owner == scope && e.sym.isExternal() && e.sym.kind == CLASS) {
- ClassSymbol sym = (ClassSymbol) e.sym;
- sym.update(pos, flags);
- return sym;
- } else {
- return new ClassSymbol(pos, name, owner, flags);
- }
- }
-
/** Creates the root class. */
public static Symbol newRootClass(PackageParser parser) {
int pos = Position.NOPOS;
@@ -1787,7 +1763,7 @@ public class ClassSymbol extends TypeSymbol {
Symbol owner = Symbol.NONE;
int flags = JAVA | PACKAGE | FINAL | SYNTHETIC;
int attrs = IS_ROOT;
- Symbol clasz = new ClassSymbol(pos, name, owner, flags, attrs);
+ Symbol clasz = new ClassSymbol(pos, name, owner, flags, attrs, NONE);
clasz.setInfo(parser);
clasz.primaryConstructor().setInfo(
Type.MethodType(Symbol.EMPTY_ARRAY, clasz.typeConstructor()));
@@ -1881,8 +1857,8 @@ public class ClassSymbol extends TypeSymbol {
}
protected TypeSymbol cloneTypeSymbolImpl(Symbol owner, int attrs) {
- ClassSymbol clone = new ClassSymbol(pos, name, owner, flags, attrs);
- clone.module = module;
+ assert !isModuleClass(): Debug.show(this);
+ ClassSymbol clone = new ClassSymbol(pos, name, owner,flags,attrs,NONE);
if (thisSym != this) clone.setTypeOfThis(typeOfThis());
return clone;
}