private List<IRType> getBoundedParameterTypeDescriptors(IConstructorInfo mi) {
    if (mi.getParameters().length == 0) {
      return Collections.emptyList();
    }

    if (mi instanceof IJavaConstructorInfo) {
      return IRTypeResolver.getDescriptors(
          ((IJavaConstructorInfo) mi).getJavaConstructor().getParameterTypes());
    } else if (mi instanceof IGosuConstructorInfo) {
      IReducedDynamicFunctionSymbol dfs = ((IGosuConstructorInfo) mi).getDfs();
      while (dfs instanceof ReducedParameterizedDynamicFunctionSymbol) {
        ReducedParameterizedDynamicFunctionSymbol pdfs =
            (ReducedParameterizedDynamicFunctionSymbol) dfs;
        dfs = pdfs.getBackingDfs();
      }

      List<IRType> boundedTypes = new ArrayList<IRType>(dfs.getArgs().size());
      if (IGosuClass.ProxyUtil.isProxy(dfs.getGosuClass())) {
        return getBoundedParamTypesFromProxiedClass(dfs);
      }

      for (int i = 0; i < dfs.getArgs().size(); i++) {
        boundedTypes.add(
            IRTypeResolver.getDescriptor(
                TypeLord.getDefaultParameterizedTypeWithTypeVars(dfs.getArgs().get(i).getType())));
      }
      return boundedTypes;
    } else {
      return getTypeDescriptors(mi.getParameters());
    }
  }
  private Constructor getJavaConstructorFromProxy(IReducedDynamicFunctionSymbol dfs) {
    IType proxyType = dfs.getGosuClass();
    IJavaType javaType = (IJavaType) IGosuClass.ProxyUtil.getProxiedType(proxyType);

    IType[] boundedDfsParams = new IType[dfs.getArgs().size()];
    for (int i = 0; i < boundedDfsParams.length; i++) {
      IType param = dfs.getArgs().get(i).getType();
      if (param instanceof ITypeVariableType && param.getEnclosingType() instanceof IGosuClass) {
        param = ((ITypeVariableType) param).getBoundingType();
      }
      boundedDfsParams[i] = param;
    }

    javaType = (IJavaType) TypeLord.getDefaultParameterizedType(javaType);
    IJavaConstructorInfo jmi =
        (IJavaConstructorInfo)
            ((IRelativeTypeInfo) javaType.getTypeInfo()).getConstructor(javaType, boundedDfsParams);
    return jmi.getRawConstructor();
  }