/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */

import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.Label

import static org.objectweb.asm.Opcodes.ACC_PUBLIC
import static org.objectweb.asm.Opcodes.ACC_STATIC
import static org.objectweb.asm.Opcodes.ACC_SUPER
import static org.objectweb.asm.Opcodes.ALOAD
import static org.objectweb.asm.Opcodes.ATHROW
import static org.objectweb.asm.Opcodes.INVOKESPECIAL
import static org.objectweb.asm.Opcodes.RETURN
import static org.objectweb.asm.Opcodes.V1_5

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.ow2.asm:asm:$asmVersion"
    }
}

/**
 * This tasks generates an utility class which allows sneaky throwing.
 */
task exceptionUtils {
    ext.classFiles = [
            "${buildDir}/generated-classes/org/codehaus/groovy/runtime/ExceptionUtils.class",
            "${compileJava.destinationDir}/org/codehaus/groovy/runtime/ExceptionUtils.class"]
    outputs.files classFiles

    doLast {
        ClassWriter cw = new ClassWriter(0);
        MethodVisitor mv;

        cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, 'org/codehaus/groovy/runtime/ExceptionUtils', null, 'java/lang/Object', null);

        cw.visitSource('ExceptionUtils.java', null);

        mv = cw.visitMethod(ACC_PUBLIC, '<init>', '()V', null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(18, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, 'java/lang/Object', '<init>', '()V', false);
        mv.visitInsn(RETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable('this', 'Lorg/codehaus/groovy/runtime/ExceptionUtils;', null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, 'sneakyThrow', '(Ljava/lang/Throwable;)V', null, null);
        mv.visitCode();
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLineNumber(20, l2);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ATHROW);
        Label l3 = new Label();
        mv.visitLabel(l3);
        mv.visitLocalVariable('e', 'Ljava/lang/Throwable;', null, l2, l3, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();

        cw.visitEnd();

        logger.lifecycle('Generating ExceptionUtils')
        classFiles.each { classFile ->
            def output = file(classFile)
            output.parentFile.mkdirs()
            output.withOutputStream {
                it << cw.toByteArray()
            }
        }
    }
}
