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 - 2024 Weber Informatics LLC | Privacy Policy