The conflict is introduced by trying constrain all the cider-middlewares to live between pr-values and session, with wrap-exceptions needing to be the first along the chain.
This mostly looks good, except for wrap-exceptions/session: (wrap-describe interruptible-eval pr-values wrap-load-file add-stdin wrap-exceptions wrap-stacktrace session wrap-complete wrap-inspect wrap-classpath wrap-info wrap-trace) If I add the constraints adding info,complete,and pr-values to the :expects of wrap-exceptions, I get something like: (wrap-describe wrap-complete wrap-info wrap-exceptions interruptible-eval pr-values wrap-load-file add-stdin wrap-stacktrace session wrap-inspect wrap-classpath wrap-trace) Which means nothing hits pr-values, which means everything breaks :-). On Sun, May 4, 2014 at 9:47 PM, Gary Trakhman <gary.trakh...@gmail.com>wrote: > ... inspired this workaround, is there a better way? > > Essentially, :expects and :requires are breaking the sort order when they > shouldn't, causing certain middlewares to just be in totally the wrong > place. I couldn't find the pattern after staring at for a bit. Since > leiningen calls linearize-middleware-stack internally, there's no more > sensible way to work around this and compose with whatever other > middlewares people might be using. > > I might be able to scrap together a minimal test case.. what do you think? > > (ns cider.nrepl.middleware.default > "Default handler for convenience, works around a flawed dependency > mechanism for now" > (:require [clojure.tools.nrepl.middleware :as mw :refer > [set-descriptor!]] > [clojure.tools.nrepl.middleware.pr-values :refer [pr-values]] > [clojure.tools.nrepl.middleware.session :refer [session]] > [clojure.tools.nrepl.misc :refer [response-for]] > [clojure.tools.nrepl.transport :as t] > [cider.nrepl.middleware > [info :as info] > [complete :as complete] > [stacktrace :as stacktrace] > [classpath :as classpath] > [inspect :as inspect] > [trace :as trace] > [exceptions :as exceptions]] > [cider.nrepl.middleware.util.cljs :as cljs])) > > (defmacro defcomposed-handler > "Generates a handler that subsumes all the other handlers, takes a name, > a sequence of middleware symbols, and a descriptor-fn to transform the > derived descriptor." > [name mws descriptor-fn] > (let [vars (map resolve mws) > descriptors (map (comp ::mw/descriptor meta) vars) > handles (into {} (mapcat :handles descriptors))] > `(do (defn ~name > [handler#] > (-> handler# ~@vars)) > (set-descriptor! > #'wrap-default > (~descriptor-fn > {:handles ~handles}))))) > > (defn conj-set > [s val] > (set (conj s val))) > > (defcomposed-handler wrap-default > [info/wrap-info > complete/wrap-complete > stacktrace/wrap-stacktrace > classpath/wrap-classpath > inspect/wrap-inspect > trace/wrap-trace > exceptions/wrap-exceptions] > (comp > #(update-in % [:requires] conj-set #'session) > #(update-in % [:expects] conj-set #'pr-values) > cljs/maybe-piggieback)) > > > > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.