// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar.backports;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class CloseResourceMethod {

  // The following method defines the code of
  //
  //     public static void $closeResource(Throwable throwable, Object resource)
  //
  // method to be inserted into utility class, and will be used instead
  // of the following implementation added by java 9 compiler:
  //
  //     private static void $closeResource(Throwable, AutoCloseable);
  //        0: aload_0
  //        1: ifnull        22
  //        4: aload_1
  //        5: invokeinterface #1,  1  // java/lang/AutoCloseable.close:()V
  //       10: goto          28
  //       13: astore_2
  //       14: aload_0
  //       15: aload_2
  //       16: invokevirtual #3 // java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V
  //       19: goto          28
  //       22: aload_1
  //       23: invokeinterface #1,  1  // java/lang/AutoCloseable.close:()V
  //       28: return
  //
  public static void closeResourceImpl(Throwable throwable, Object resource) throws Throwable {
    try {
      if (resource instanceof AutoCloseable) {
        ((AutoCloseable) resource).close();
      } else {
        try {
          Method method = resource.getClass().getMethod("close");
          method.invoke(resource);
        } catch (NoSuchMethodException | SecurityException e) {
          throw new AssertionError(resource.getClass() + " does not have a close() method.", e);
        } catch (IllegalAccessException
            | IllegalArgumentException
            | ExceptionInInitializerError e) {
          throw new AssertionError("Fail to call close() on " + resource.getClass(), e);
        } catch (InvocationTargetException e) {
          throw e.getCause();
        }
      }
    } catch (Throwable e) {
      // NOTE: we don't call addSuppressed(...) since the call will be removed
      // by try-with-resource desugar anyways.
      throw throwable != null ? throwable : e;
    }
  }
}
