if (clone != null) symbol = clone; return Type.singleType(prefix, symbol);
prefix = apply(prefix); return Type.singleType(prefix, clone != null ? clone : symbol);
        public Type apply(Type type) {            switch (type) {            case TypeRef(Type prefix, Symbol symbol, Type[] args):                Type inline = (Type)inlines.get(symbol);                if (inline != null) return inline;                return map(type);            case SingleType(Type prefix, Symbol symbol):                // !!! prefix = apply(prefix);                // !!! symbol = prefix.rebind(symbol);                // !!! commented out because of following example:                // class Bar {                //   val b: Bar = null;                //   class Linker { def b: Bar.this.b.type = Bar.this.b; }                // }                Symbol clone = (Symbol)cloner.clones.get(symbol);                if (clone != null) symbol = clone;                return Type.singleType(prefix, symbol);            case ThisType(Symbol symbol):                if (symbol.isNone()) return type;                return clasz.thisType();            case CompoundType(Type[] parents, Scope members):                if (type.symbol() != clasz) return map(type);                if (parents.length <= 1) return type;                Symbol iface = (Symbol)interfaces.get(clasz);                if (iface == null) {                    int i = 1;                    while (i < parents.length && parents[i].symbol().isInterface()) i++;                    if (i == parents.length) return type;                    parents = Type.cloneArray(parents);                    while (i < parents.length) {                        if (!parents[i].symbol().isInterface())                            parents[i] = Type.typeRef(parents[i].prefix(), (Symbol)interfaces.get(parents[i].symbol()), parents[i].typeArgs());                        i++;                    }                    return Type.compoundType(parents, members, clasz);                }                assert parents[parents.length - 1].symbol() == iface: type;                if (parents.length == 2) return type;                for (int i = 1; i < parents.length - 1; i++) {                    Symbol mixin = parents[i].symbol();                    Symbol imix = mixin.isInterface()                        ? mixin                        : (Symbol)interfaces.get(mixin);                    assert iface.isSubClass(imix): type+" - "+i;                }                parents = new Type[] {parents[0], parents[parents.length - 1]};                return Type.compoundType(parents, members, clasz);            default:                return map(type);            }        }