coldfusion.compiler.FactoredNodeAggregation cannot be cast to coldfusion.compiler.ASTfunctionDefinition
I get the above error when attempting to replace a really, really old legacy custom tag with a new custom tag that has some substantial workflow improvements. I only have one idea on how to debug this: comment out different parts of the code (binary search style) until it will compile, narrowing my search until I find the problem code.
Has anyone else ever seen this error before? Any idea what it could possibly be? Contextually, it sounds like I’m trying to use … something… as a function that isn’t defined as a function. That doesn’t ring a bell so I’m going to try the binary search idea.
Update: It’s running on CF 8.0.1, and doesn’t use any <cfscript> blocks at all. Using the binary search of commenting out, I’ve narrowed it down to a CFThread that starts a background thread that never re-joins the page (by design).
If I comment out the entire contents of the thread, the error goes away (so the cfthread tag itself doesn’t appear to have problems on its own…). If I copy the contents of the thread to its own template, that template will compile fine (so the thread contents doesn’t appear to have problems on its own…)… so… in theory it should work? I don’t know. This is me with my arms up in the air. (WTF?)
I think I’ve already disproven this idea by un-commenting a small section without the error coming back, but a CFThread should have access to local custom tags that the template creating the thread would have, right? so if there’s foo.cfm, it could be accessed from the page as <cf_foo>, and the thread could do the same?
In the last week I’ve been in contact with the ColdFusion Engineering team at Adobe about this issue and they confirmed for me that this is a bug in ColdFusion.
Specifically, if the number of lines of code inside the thread tag body was too large, it would cause a compile error. The work-around, which I discovered a day or two before I got my answer, is to use a
<cfinclude />to import your thread contents from another file; or to put the code into a method somewhere and call that method from inside the thread body. (Presumably, a custom tag or other clever methods of encapsulation would also work.)That explains the part of the whole thing that was driving me absolutely insane: that commenting out various parts of the thread body would sometimes make it compile… and now I know it was because enough of the thread body was commented out.
They report that they have fixed the bug, so I assume it will be fixed in the next cumulative hot-fix (if there is one), and in ColdFusion 9.