summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/LambdaLiftPhase.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/transformer/LambdaLiftPhase.java')
-rw-r--r--sources/scalac/transformer/LambdaLiftPhase.java175
1 files changed, 0 insertions, 175 deletions
diff --git a/sources/scalac/transformer/LambdaLiftPhase.java b/sources/scalac/transformer/LambdaLiftPhase.java
deleted file mode 100644
index 06c1984249..0000000000
--- a/sources/scalac/transformer/LambdaLiftPhase.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-//import java.util.ArrayList;
-
-import scalac.*;
-import scalac.parser.*;
-import scalac.symtab.*;
-import scalac.util.ArrayApply;
-
-
-public class LambdaLiftPhase extends Phase implements Kinds, Modifiers {
-
- /** Initializes this instance. */
- public LambdaLiftPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- /** Applies this phase to the given compilation unit.
- *
- * @param unit
- */
- public void apply(CompilationUnit unit) {
- new LambdaLift(global, this).apply(unit);
- }
-
- /** ...
- *
- * @param sym
- * @param tp
- * @return
- */
- public Type transformInfo(Symbol sym, Type tp) {
- /*
- if (global.debug)
- global.log("transform info for " + sym + ":" + tp + sym.locationString());
- */
- Type tp1 = tp;
- if (sym != Symbol.NONE) {
- switch (tp) {
- case MethodType(_, _):
- case PolyType(_, _):
- tp1 = transform(tp, sym);
- break;
- default:
- if (sym.kind == CLASS)
- tp1 = transform(tp, sym);
- else
- tp1 = transform(tp, sym.owner());
- }
- }
- if (sym.isCaptured())
- return global.definitions.REF_TYPE(tp1);
- else return tp1;
- }
-
- /** Add proxies as type arguments for propagated type parameters.
- *
- * @param tp
- * @param owner
- * @return
- */
- Type transform(Type tp, Symbol owner) {
- return transformTypeMap.setOwner(owner).apply(tp);
- }
-
- /** MapOnlyTypes => All symbols are mapped to themselves.
- */
- private class TransformTypeMap extends Type.MapOnlyTypes {
- Symbol owner;
-// ArrayList/*<Symbol>*/ excluded = new ArrayList();
- Type.Map setOwner(Symbol owner) { this.owner = owner; return this; }
-
- public Type apply(Type tp) {
- switch (tp) {
- case TypeRef(Type pre, Symbol sym, Type[] targs):
- if (sym.kind == CLASS) {
- switch (pre) {
- case NoPrefix:
- pre = sym.owner().enclClass().thisType();
- tp = Type.typeRef(pre, sym, targs);
- }
- }
- switch (pre) {
- case NoPrefix:
- if (LambdaLift.isLocal(sym, owner)) {
- assert targs.length == 0;
- return proxy(sym, owner).type();
- }
- break;
- case ThisType(_):
- if (sym.kind == CLASS &&
- sym.primaryConstructor().isUpdatedAt(LambdaLiftPhase.this)) {
- Symbol[] tparams = sym.primaryConstructor().nextInfo().typeParams();
- int i = tparams.length;
- while (i > 0 && tparams[i-1].isSynthetic())
- i--;
- if (i < tparams.length) {
- if (global.debug)
- global.log("adding proxies for " + sym +
- ": " + ArrayApply.toString(tparams));
-
- Type[] targs1 = new Type[tparams.length];
- System.arraycopy(map(targs), 0, targs1, 0, targs.length);
- while (i < tparams.length) {
- targs1[i] = proxy(tparams[i], owner).type();
- i++;
- }
- return Type.typeRef(pre, sym, targs1);
- }
- }
- }
- break;
-/*
- case PolyType(Symbol[] tparams, _):
- if (tparams.length != 0) {
- int len = excluded.size();
- for (int i = 0; i < tparams.length; i++)
- excluded.add(tparams[i]);
- Type tp1 = map(tp);
- for (int i = 0; i < tparams.length; i++)
- excluded.remove(excluded.size() - 1);
- return tp1;
- }
-*/
- }
- return map(tp);
- }
- }
-
- private TransformTypeMap transformTypeMap = new TransformTypeMap();
-
- /** Return closest enclosing (type)parameter that has same name as `fv',
- * or `fv' itself if this is the closest definition.
- *
- * @param fv
- * @param owner
- * @return
- */
- Symbol proxy(Symbol fv, Symbol owner) {
- if (global.debug)
- global.log("proxy " + fv + " of " + fv.owner() +
- " in " + LambdaLift.enclFun(owner));
- Symbol o = owner;
- while (o.kind != NONE) {
- if (global.debug)
- global.log("looking in " + LambdaLift.enclFun(o) + " " +
- ArrayApply.toString(o.typeParams()));
- Symbol fowner = LambdaLift.enclFun(o);
- if (fowner.isMethod()) {
- if (LambdaLift.enclFun(fv.owner()) == fowner) return fv;
- Type ft = (fowner.isUpdatedAt(this)) ? fowner.nextType()
- : fowner.type();
- Symbol[] ownerparams = fv.isType() ? ft.typeParams()
- : ft.firstParams();
- for (int i = 0; i < ownerparams.length; i++) {
- if (ownerparams[i].name == fv.name)
- return ownerparams[i];
- }
- }
- assert o.owner() != o;
- o = o.owner();
- }
- return fv;
- //throw new ApplicationError("proxy " + fv + " in " + owner);
- }
-
-}