case NoPrefix:
    private final Type.Map typer = new Type.Map(){public Type apply(Type type){        switch (type) {        case ErrorType:        case NoType:            return type;        case ThisType(Symbol symbol):            Symbol clone = (Symbol)clones.get(symbol);            if (clone == null) return type;            return Type.ThisType(clone);        case SingleType(Type prefix, Symbol symbol):            Symbol clone = (Symbol)clones.get(symbol);            if (clone == null) return map(type);            return Type.singleType(apply(prefix), clone);        case ConstantType(_, _):            return map(type);        case TypeRef(Type prefix, Symbol symbol, Type[] args):            Symbol clone = (Symbol)clones.get(symbol);            if (clone == null) return map(type);            return Type.typeRef(apply(prefix), clone, map(args));        case CompoundType(Type[] parts, Scope members):            Symbol clone = /* !!! getCompoundClone */(type.symbol());            return Type.compoundType(map(parts), /* !!! cloneScope */(members), clone);        case MethodType(Symbol[] vparams, Type result):            Symbol[] clones = cloneSymbols(vparams);            return Type.MethodType(clones, apply(result));        case PolyType(Symbol[] tparams, Type result):            Symbol[] clones = cloneSymbols(tparams);            return Type.PolyType(clones, apply(result));        case UnboxedType(_):            return type;        case UnboxedArrayType(_):            return map(type);        default:            throw Debug.abort("illegal case", type);        }    }};