Welcome! Please see the About page for a little more info on how this works.

0 votes
in Errors by

There are several examples of frameworks that attempt to de-mangle a Java class name into a Clojure symbol (including namespace); this is useful for writing out an improved, Clojure-specific stack trace when reporting exceptions.

Existing libraries are based on regular expression matching and guesswork, and can occasionally give incorrect results, such as when a namespace or function name actually contains an underscore.

It would be helpful for authors of such frameworks if Clojure would expose a static final field on such classes with the proper name that should appear in the stack trace; libraries would then be able to use reflection to access the proper name of the field, without the current guesswork.

I would suggest CLOJURE_SOURCE_NAME as a reasonable name for such a field.

Other Clojure class constructs beyond functions, such as reified types and protocol implementations, would also benefit, though it is less obvious what exact string value would properly and unambiguously identify what purpose the class plays.

6 Answers

0 votes
by

Comment made by: alexmiller

FYI, there is a patch on the way in for 1.6 that contains a new demunge function in Compiler. However, the munged name is not always reversible so having the original around is a good idea.

0 votes
by

Comment made by: jafingerhut

The patch Alex is referring to is attached to CLJ-1083.

0 votes
by

Comment made by: jafingerhut

Howard, there seems to be some overlap in the intent between this ticket and CLJ-1278. I guess either of them could be done without the other, but wanted to check.

0 votes
by

Comment made by: dsg

Here's an initial stab at adding this feature.

Some notes:

  • This will tag emitted classes from {{deftype}} and {{fn}}
  • This will handle {{fn}}s that are enclosed, but the output will be slightly different from the standard {{demunge}} function: only the initial {{$}} is transformed to a {{/}}.
  • Unfortunately, because the {{defn}} for type/record constructor occurs in a {{let}} form, the generated symbol doesn't match what it should be.
  • There is no exposed API to get the demunged symbol from the class. Perhaps {{demunge}} should check if the given name corresponds to a class with this field?

I welcome any input on how this should really work. In particular, any ideas on how to best deal with {{defn}}s that are not top-level forms.

0 votes
by

Comment made by: jafingerhut

Patch CLJ-1284-store-demunged-names.patch dated Aug 20 2014 does not apply cleanly to latest master after some commits were made to Clojure on Aug 29, 2014. I have not checked whether it applied cleanly before that day, nor have I checked how easy or difficult it might be to update this patch.

0 votes
by
Reference: https://clojure.atlassian.net/browse/CLJ-1284 (reported by hlewisship)
...