diff options
author | paltherr <paltherr@epfl.ch> | 2003-11-12 19:12:52 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-11-12 19:12:52 +0000 |
commit | a61eb893701f4d6d34ee7156e8fa8b52375ace07 (patch) | |
tree | 15fc7e22f70cd653cc68fc2eef78e3f05f8c6f25 /sources/scalac/transformer/AddAccessors.java | |
parent | f5437e9a8bb543cf57b295739dd3abdebb7be651 (diff) | |
download | scala-a61eb893701f4d6d34ee7156e8fa8b52375ace07.tar.gz scala-a61eb893701f4d6d34ee7156e8fa8b52375ace07.tar.bz2 scala-a61eb893701f4d6d34ee7156e8fa8b52375ace07.zip |
- Fixed some bugs in AddAccessors
- Moved all code into AddAccessorsPhase
Diffstat (limited to 'sources/scalac/transformer/AddAccessors.java')
-rw-r--r-- | sources/scalac/transformer/AddAccessors.java | 146 |
1 files changed, 0 insertions, 146 deletions
diff --git a/sources/scalac/transformer/AddAccessors.java b/sources/scalac/transformer/AddAccessors.java deleted file mode 100644 index 9b91677a83..0000000000 --- a/sources/scalac/transformer/AddAccessors.java +++ /dev/null @@ -1,146 +0,0 @@ -/* ____ ____ ____ ____ ______ *\ -** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala ** -** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL ** -** /_____/\____/\___/\____/____/ ** -\* */ - -// $OldId: AddAccessors.java,v 1.2 2002/11/21 14:14:31 schinz Exp $ -// $Id$ - -package scalac.transformer; - -import scalac.*; -import scalac.ast.*; -import scalac.typechecker.*; -import scalac.symtab.*; -import scalac.util.*; - -import java.util.*; - -/** - * Add private accessor functions for all class constructor arguments - * which are accessed from within the class' methods, or nested - * classes. - * - * @author Michel Schinz - * @version 1.0 - */ - -public class AddAccessors extends Transformer { - public AddAccessors(Global global) { - super(global); - } - - protected Name valName(Symbol sym) { - return Name.fromString(sym.name.toString() + "$"); - } - - protected final HashMap/*<Symbol,Symbol>*/ accessorMap = new HashMap(); - protected boolean inClassContext; - protected Symbol clasz; - - protected Symbol accessor(Symbol sym) { - Symbol accessor = (Symbol)accessorMap.get(sym); - if (accessor == null) { - accessor = new TermSymbol(sym.pos, - sym.name, - sym.classOwner(), - Modifiers.STABLE - | Modifiers.ACCESSOR - | Modifiers.PRIVATE); - accessor.setType(Type.MethodType(Symbol.EMPTY_ARRAY, sym.type())); - accessorMap.put(sym, accessor); - } - return accessor; - } - - public Tree transform(Tree tree) { - switch (tree) { - case ClassDef(_, // : - _, - Tree.AbsTypeDef[] tparams, - Tree.ValDef[][] vparams, - Tree tpe, - Tree.Template impl): { - Symbol backup = clasz; - Symbol clsSym = clasz = tree.symbol(); - assert vparams.length == 1; - Tree.ValDef[] params = vparams[0]; - - // Recursively transform body - Tree[] body = impl.body; - LinkedList/*<Tree>*/ newBody = new LinkedList(); - for (int i = 0; i < body.length; ++i) { - Tree mem = body[i]; - Symbol sym = mem.symbol(); - inClassContext = - mem.definesSymbol() && (sym.isClass() || sym.isMethod()); - newBody.add(transform(mem)); - } - - // Add value definitions and accessors for all constructor - // arguments which were found in the body of the class. - Scope newMembers = new Scope(clsSym.members()); - for (int i = 0; i < params.length; ++i) { - Symbol paramSym = params[i].symbol(); - if (accessorMap.containsKey(paramSym)) { - int pos = paramSym.pos; - Symbol accessorSym = (Symbol)accessorMap.get(paramSym); - - Symbol valSym = new TermSymbol(pos, - valName(paramSym), - clsSym, - Modifiers.PRIVATE); - valSym.setType(paramSym.type()); - - newBody.addFirst(gen.DefDef(accessorSym, gen.Ident(pos, valSym))); - newMembers.enter(accessorSym); - - newBody.addFirst(gen.ValDef(valSym, gen.Ident(pos, paramSym))); - newMembers.enter(valSym); - } - } - - // Update class type with new values/accessors. - clsSym.updateInfo(Type.compoundType(clsSym.parents(), - newMembers, - clsSym)); - - inClassContext = false; - Tree[] newParents = transform(impl.parents); - - Tree[] newBodyA = (Tree[])newBody.toArray(new Tree[newBody.size()]); - - clasz = backup; - return copy.ClassDef(tree, - clsSym, - transform(tparams), - transform(vparams), - transform(tpe), - copy.Template(impl, newParents, newBodyA)); - } - - case Select(Tree qualifier, _): { - Symbol sym = tree.symbol(); - assert sym.kind != Kinds.NONE : tree; - if (sym.owner().isPrimaryConstructor()) - return gen.Apply(gen.Select(tree.pos, transform(qualifier), accessor(sym))); - else - return copy.Select(tree, sym, transform(qualifier)); - } - - case Ident(_): { - Symbol sym = tree.symbol(); - if (inClassContext - && sym.name.isTermName() - && sym.owner().isPrimaryConstructor()) - return gen.Apply(gen.Select(gen.This(tree.pos, clasz), accessor(sym))); - else - return copy.Ident(tree, sym); - } - - default: - return super.transform(tree); - } - } -} |