loxs
Is there an easy way to find instances where a function gets called in code?
I need this for statistical reasons and “all” is a very loose term. It’s OK if I don’t find absolutely all places, though I’d like it if I find places where functions get called via :erlang.apply/3. Also, where it’s possible (where available at compile time), I’d like to get the variables with which the function is called.
Is this doable without major hackery, or am I asking for too much?
Most Liked
benwilson512
You can’t call macros via apply/3 so you’ll run into a bit of an issue there. apply/3 in general is difficult because it resists static analysis of the program. I’m not sure that it’s even theoretically possible to account for all such uses since every instance of apply/3 that takes dynamic input could in theory call your function. Proving that it would be very very hard.
sasajuric
Looks like mix xref is something that might help you. If it doesn’t give you everything you need, you could use its source code for inspiration, or perhaps even extend it.
I don’t understand what do you mean by this?
Qqwy
If you have access to the original function that is being called, then it is rather simple: Change the function to be a macro.
You then have access to the scope in which the macro is called, and, if you want, you can inspect and evaluate the arguments it was called with. If you want more info on (unhygienic) macros, I’d suggest @sasajuric’s wonderful article series on macros.
Without doing this, it’s going to be hard; your best bet in that case is probably to run a string search algorithm on the code in your codebase. But this will only find occurrences like Foo.bar(), and possibly not the import Foo ... some other code... bar() cases. And cases where apply is used or where the function is called after the module name has been passed around as a variable will be impossible to find this way.
loxs
I mean that if the fun gets called in the code like my_fun("/api/dashboard/home") I want to get “/api/dashboard/home”
benwilson512
Can you elaborate on the overall project you’re undertaking?







