Comment made by: stuart.sierra
Thanks for working on these patches. I did some more testing, and uncovered some more complications.
Guessing the file extension leads to unpredictable results, because you don't know which file gets moved. It's not uncommon to have both {{.clj}} and {{.cljs}} version of the same namespace, for example with {{:require-macros}} in ClojureScript.
Unfortunately, even specifying a "platform" argument doesn't completely solve the problem, because you can have {{.cljc}} file at the same time as {{.clj}} and {{.cljs}}. This may not be common, but it's explicitly allowed for in the (link: http://dev.clojure.org/display/design/Reader Conditionals text: design of reader conditionals). For example, a library may have a platform-neutral .cljc file and override it with a platform-specific file. In this case, even if you specify a "platform" argument, you still can't control which file gets moved.
So now I think the only way for an operation like "move namespace" to make sense is to move all the files defining that namespace, preserving their file extensions. This seems like what one would want from a user perspective as well.
So {{move-ns}} should take new/old symbols, find all the matching files with any extension, move/rename them all while preserving extensions, then apply the textual transformation to all .clj, .cljs, and .cljc files.
If we're searching for files, we might as well eliminate the need to specify the source path, so this also relates to TNS-39.