// Copyright (c) 2018, 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.annotations.version2;

import static com.android.tools.r8.ir.desugar.annotations.CovariantReturnTypeAnnotationTransformerTest.*;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;

// Generated by running tools/asmifier.py on build/classes/test/com/android/tools/r8/ir/desugar/
// annotations/version2/C.class, removing the subpackage "version2" from all class names, and
// manually changing the name of the CovariantReturnType and CovariantReturnTypes annotations to
// "Ldalvik/annotation/codegen/CovariantReturnType;" and
// "Ldalvik/annotation/codegen/CovariantReturnType$CovariantReturnTypes;", respectively.
public class CDump implements Opcodes {
  public static byte[] dump() throws Exception {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, PACKAGE_NAME + "/C", null, PACKAGE_NAME + "/B", null);

    cw.visitInnerClass(
        CRT_NAME + "$" + CRTS_SIMPLE_NAME,
        CRT_NAME,
        CRTS_SIMPLE_NAME,
        ACC_PUBLIC + ACC_STATIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE);

    {
      mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
      mv.visitCode();
      mv.visitVarInsn(ALOAD, 0);
      mv.visitMethodInsn(INVOKESPECIAL, PACKAGE_NAME + "/B", "<init>", "()V", false);
      mv.visitInsn(RETURN);
      mv.visitMaxs(1, 1);
      mv.visitEnd();
    }
    {
      mv = cw.visitMethod(ACC_PUBLIC, "method", "()L" + PACKAGE_NAME + "/A;", null, null);
      {
        av0 = mv.visitAnnotation("L" + CRT_NAME + "$" + CRTS_SIMPLE_NAME + ";", false);
        {
          AnnotationVisitor av1 = av0.visitArray("value");
          {
            AnnotationVisitor av2 = av1.visitAnnotation(null, "L" + CRT_NAME + ";");
            av2.visit("returnType", Type.getType("L" + PACKAGE_NAME + "/B;"));
            av2.visit("presentAfter", new Integer(25));
            av2.visitEnd();
          }
          {
            AnnotationVisitor av2 = av1.visitAnnotation(null, "L" + CRT_NAME + ";");
            av2.visit("returnType", Type.getType("L" + PACKAGE_NAME + "/C;"));
            av2.visit("presentAfter", new Integer(28));
            av2.visitEnd();
          }
          av1.visitEnd();
        }
        av0.visitEnd();
      }
      mv.visitCode();
      mv.visitTypeInsn(NEW, PACKAGE_NAME + "/C");
      mv.visitInsn(DUP);
      mv.visitMethodInsn(INVOKESPECIAL, PACKAGE_NAME + "/C", "<init>", "()V", false);
      mv.visitInsn(ARETURN);
      mv.visitMaxs(2, 1);
      mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
  }
}
