All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fuin.units4j.analyzer.MCAMethodVisitor Maven / Gradle / Ivy

/**
 * Copyright (C) 2015 Michael Schnell. All rights reserved. 
 * http://www.fuin.org/
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 3 of the License, or (at your option) any
 * later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library. If not, see http://www.gnu.org/licenses/.
 */
package org.fuin.units4j.analyzer;

import java.util.List;

import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

/**
 * Visits a method and checks if one of a set of methods is called in that method.
 */
public final class MCAMethodVisitor extends MethodVisitor {

    private final MCAClassVisitor classVisitor;

    private final List toFind;

    private MCAMethod found;

    private int line;

    /**
     * Constructor with parent and list of methods to locate.
     * 
     * @param classVisitor
     *            Parent.
     * @param toFind
     *            List of methods to find.
     */
    public MCAMethodVisitor(final MCAClassVisitor classVisitor, final List toFind) {
        super(Opcodes.ASM5, new EmptyMethodVisitor());
        if (classVisitor == null) {
            throw new IllegalArgumentException("Argument 'classVisitor' canot be NULL");
        }
        if (toFind == null) {
            throw new IllegalArgumentException("Argument 'toFind' canot be NULL");
        }
        this.classVisitor = classVisitor;
        this.toFind = toFind;
    }

    @Override
    public final void visitMethodInsn(final int opcode, final String owner, final String name, final String descr, final boolean itf) {

        final MCAMethod m = new MCAMethod(owner, name, descr);
        final int idx = toFind.indexOf(m);
        if (idx > -1) {
            found = toFind.get(idx);
        }

    }

    @Override
    public final void visitCode() {
        found = null;
    }

    @Override
    public final void visitLineNumber(final int line, final Label start) {
        this.line = line;
    }

    @Override
    public final void visitEnd() {
        if (found != null) {
            classVisitor.addCall(found, line);
        }
    }

    /**
     * Returns the information if a method was found.
     * 
     * @return If the method was found TRUE, else FALSE.
     */
    public final boolean isFound() {
        return found != null;
    }

    /**
     * Returns the parent class visitor.
     * 
     * @return Parent.
     */
    public final MCAClassVisitor getClassVisitor() {
        return classVisitor;
    }

    /**
     * Returns the list of methods to find.
     * 
     * @return Method list.
     */
    public final List getToFind() {
        return toFind;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy