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

org.walkmod.javalang.compiler.reflection.RequiredMethodPredicate Maven / Gradle / Ivy

There is a newer version: 2.3.10
Show newest version
/*
 * Copyright (C) 2015 Raquel Pau and Albert Coroleu.
 * 
 * Walkmod 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.
 * 
 * Walkmod 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 Walkmod. If
 * not, see .
 */
package org.walkmod.javalang.compiler.reflection;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.walkmod.javalang.ast.expr.Expression;
import org.walkmod.javalang.ast.expr.MethodCallExpr;
import org.walkmod.javalang.compiler.Predicate;
import org.walkmod.javalang.compiler.symbols.SymbolType;
import org.walkmod.javalang.compiler.types.TypeVisitorAdapter;
import org.walkmod.javalang.compiler.types.Types;

public class RequiredMethodPredicate> implements Predicate> {

    private MethodCallExpr requiredMethod;

    private TypeVisitorAdapter visitor;

    private A ctx;

    public RequiredMethodPredicate(MethodCallExpr requiredMethod, TypeVisitorAdapter visitor, A ctx) {
        this.requiredMethod = requiredMethod;
        this.visitor = visitor;
        this.ctx = ctx;
    }

    @Override
    public boolean filter(Class candidate) {
        boolean isCompatible = true;

        List methods = new LinkedList();

        boolean returnTypeCompatible = false;
        methods.addAll(Arrays.asList(candidate.getDeclaredMethods()));

        methods.addAll(Arrays.asList(candidate.getMethods()));
        Iterator it = methods.iterator();

        while (it.hasNext() && !returnTypeCompatible) {

            Method currentMethod = it.next();

            // checking method name
            if (currentMethod.getName().equals(requiredMethod.getName())) {
                List args = requiredMethod.getArgs();
                Class[] parameterTypes = currentMethod.getParameterTypes();
                if (args != null) {
                    boolean compatibleArgs = true;
                    int k = 0;

                    for (Expression argExpr : args) {
                        argExpr.accept(visitor, ctx);
                        SymbolType typeArg = (SymbolType) argExpr.getSymbolData();
                        if (!Types.isCompatible(typeArg.getClazz(), parameterTypes[k])) {
                            compatibleArgs = false;
                        }
                        k++;
                    }
                    returnTypeCompatible = compatibleArgs;
                } else {
                    returnTypeCompatible = true;
                }
            }
        }

        isCompatible = returnTypeCompatible;

        return isCompatible;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy