August 30, 2014
https://issues.dlang.org/show_bug.cgi?id=13406

          Issue ID: 13406
           Summary: Feature request: @trace attribute for automatic
                    tracing, OR @(scope, scopeFn)
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: DMD
          Assignee: nobody@puremagic.com
          Reporter: kevin.lamonte@gmail.com

There have been several proposals for logging in phobos, but I have not seen a request for tracing.  By tracing I mean on-the-fly recording of function entry+args and exit+return, sent to a logging framework of some kind.  Other languages use aspect-oriented programming (Java) and before/after methods (lisp) to apply this automatically to all code in a project.

I believe that a @trace function attribute could satisfy this very well. Desired behavior:

@trace int foo(string bar) {
   ... blah ...
}

...magically becomes...

int foo(string bar) {
    traceFunctionEnter(__LINE__, __FILE__, __MODULE__, __FUNCTION__,
__PRETTYFUNCTION__, [ bar ]);
    scope(success) {
        traceFunctionExitSuccess(__LINE__, __FILE__, __MODULE__, __FUNCTION__,
__PRETTYFUNCTION__, result);
    }
    scope(failure) {
        traceFunctionExitFailure(__LINE__, __FILE__, __MODULE__, __FUNCTION__,
__PRETTYFUNCTION__, result);
    }

   ... blah ...
}

Add the ability to set traceFunctionEnter / traceFunctionExitFailure / traceFunctionExitSuccess and a logging framework could automagically plug in and become a tracing framework too.

If @trace as a feature is too library-specific, this idea could instead be implemented by something like @(scope, &scopeFn) where scopeFn looks like:

void scopeFn(scopeType, __LINE__, __FILE__, __MODULE__, __FUNCTION__,
__PRETTYFUNCTION__, [ args ])

...where scopeType is an enum value meaning "in", "success", or "failure", and args contains either the input parameters or the return (value or exception), respectively.

--