newOwner,
    protected Type cloneSymbolsInMethodType(Type type,                                            SymbolMapApplier smApplier,                                            Map symbolMap) {        switch (type) {        case NoType:        case ThisType(_):        case TypeRef(_, _, _):        case SingleType(_, _):        case CompoundType(_, _):            return type;        case MethodType(Symbol[] vparams, Type result): {            Symbol[] newVParams = new Symbol[vparams.length];            for (int i = 0; i < vparams.length; ++i) {                newVParams[i] = vparams[i].cloneSymbol();                newVParams[i].setType(smApplier.apply(newVParams[i].info()));                symbolMap.put(vparams[i], newVParams[i]);            }            return new Type.MethodType(newVParams,                                       cloneSymbolsInMethodType(result,                                                                smApplier,                                                                symbolMap));        }        case PolyType(Symbol[] tparams, Type result): {            Symbol[] newTParams = new Symbol[tparams.length];            for (int i = 0; i < tparams.length; ++i) {                newTParams[i] = tparams[i].cloneSymbol();                symbolMap.put(tparams[i], newTParams[i]);            }            return new Type.PolyType(newTParams,                                     cloneSymbolsInMethodType(result,                                                              smApplier,                                                              symbolMap));        }        default:            throw global.fail("unexpected method type: " + Debug.toString(type));        }    }