Merge pull request #1 from mopp/support_otp21

Support Erlang/OTP 21
diff --git a/rebar.config b/rebar.config
index c475d40..8333493 100644
--- a/rebar.config
+++ b/rebar.config
@@ -36,6 +36,6 @@
  [
   {test,
    [
-    {plugins, [rebar_covertool]}
+    {plugins, [covertool]}
    ]}
  ]}.
diff --git a/src/passage_pd.erl b/src/passage_pd.erl
index 2f39821..960f2b1 100644
--- a/src/passage_pd.erl
+++ b/src/passage_pd.erl
@@ -54,6 +54,16 @@
 %%------------------------------------------------------------------------------
 -define(ANCESTORS_KEY, passage_span_ancestors).
 
+-ifdef('OTP_RELEASE').
+%% The 'OTP_RELEASE' macro introduced at OTP-21,
+%% so we can use it for detecting whether the Erlang compiler supports new try/catch syntax or not.
+-define(CAPTURE_STACKTRACE, :__StackTrace).
+-define(GET_STACKTRACE, __StackTrace).
+-else.
+-define(CAPTURE_STACKTRACE, ).
+-define(GET_STACKTRACE, erlang:get_stacktrace()).
+-endif.
+
 %%------------------------------------------------------------------------------
 %% Exported Types
 %%------------------------------------------------------------------------------
@@ -135,8 +145,8 @@
                 start_span(OperationName, Options),
                 Fun()
             catch
-                Class:Error ->
-                    Stack = erlang:get_stacktrace(),
+                Class:Error ?CAPTURE_STACKTRACE ->
+                    Stack = ?GET_STACKTRACE,
                     log(#{?LOG_FIELD_ERROR_KIND => Class,
                           ?LOG_FIELD_MESSAGE => Error,
                           ?LOG_FIELD_STACK => Stack},
diff --git a/src/passage_transform.erl b/src/passage_transform.erl
index 80dc844..c412d48 100644
--- a/src/passage_transform.erl
+++ b/src/passage_transform.erl
@@ -361,10 +361,10 @@
 make_catch_clauses(Line, _) ->
     ClassVar = make_var(Line, "__Class"),
     ErrorVar = make_var(Line, "__Error"),
-    GetStrackTrace = make_call_remote(Line, erlang, get_stacktrace, []),
+    {StackTraceVar, GetStrackTrace} = make_stacktrace(Line),
     [
      {clause, Line,
-      [{tuple, Line, [ClassVar, ErrorVar, {var, Line, '_'}]}],
+      [{tuple, Line, [ClassVar, ErrorVar, StackTraceVar]}],
       [],
       [
        make_error_log(
@@ -378,3 +378,21 @@
       ]
      }
     ].
+
+-ifdef('OTP_RELEASE').
+
+-spec make_stacktrace(line()) -> {expr_var(), expr_var()}.
+make_stacktrace(Line) ->
+    StackTraceVar = make_var(Line, "__StackTrace"),
+    GetStrackTrace = StackTraceVar,
+    {StackTraceVar, GetStrackTrace}.
+
+-else.
+
+-spec make_stacktrace(line()) -> {expr_var(), expr_call_remote()}.
+make_stacktrace(Line) ->
+    StackTraceVar = {var, Line, '_'},
+    GetStrackTrace = make_call_remote(Line, erlang, get_stacktrace, []),
+    {StackTraceVar, GetStrackTrace}.
+
+-endif.