using System;
using PostSharp.Samples.ExceptionHandling;

// Add the AddContextOnException aspect to all methods in the assembly.

[assembly: AddContextOnException]

namespace PostSharp.Samples.ExceptionHandling
{
  internal class Program
  {
    private static void Main(string[] args)
    {
      MainCore();

      // Proofs that MainCore succeeded despite Finbonacci throwing an exception.
      Console.WriteLine("The program returns successfully.");
    }

    [ReportAndSwallowException]
    private static void MainCore()
    {
      // The Fibonacci method will fail with an exception, but the [ReportAndSwallowException] aspect
      // will swallow the exception and the MainCore method will succeed.
      Fibonacci(5);
    }

    public static int Fibonacci(int n)
    {
      if (n < 0)
        throw new ArgumentOutOfRangeException();

      if (n == 0)
        return 0;
      // The next lines are intentionally commented out to cause an exception:

      // if (n == 1)
      //    return 1;

      return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
  }
}