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

org.walkmod.javalang.compiler.reflection.CompatibleLambdaResultPredicate 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.HashMap;
import java.util.Map;

import org.walkmod.javalang.ast.SymbolData;
import org.walkmod.javalang.ast.expr.LambdaExpr;
import org.walkmod.javalang.ast.stmt.ExpressionStmt;
import org.walkmod.javalang.compiler.Predicate;
import org.walkmod.javalang.compiler.symbols.SymbolTable;
import org.walkmod.javalang.compiler.symbols.SymbolType;
import org.walkmod.javalang.visitors.VoidVisitor;

public class CompatibleLambdaResultPredicate implements Predicate {

	private LambdaExpr expr;

	private VoidVisitor typeResolver;

	private A ctx;

	private Map typeMapping;
	
	private SymbolTable symTable;

	public CompatibleLambdaResultPredicate(LambdaExpr expr,
			VoidVisitor typeResolver, A ctx,
			Map typeMapping, 
			SymbolTable symTable) {
		this.expr = expr;
		this.typeResolver = typeResolver;
		this.ctx = ctx;
		this.typeMapping = typeMapping;
		this.symTable = symTable;
	}

	@Override
	public boolean filter(Method method) throws Exception {
		
		SymbolData returnType = expr.getBody().getSymbolData();
		if (returnType == null) {
			int scopeLevel = symTable.getScopeLevel();
			try {
				expr.accept(typeResolver, ctx);
			} catch (Exception e) {
				int currentScopeLevel = symTable.getScopeLevel();
				while(currentScopeLevel > scopeLevel){
					symTable.popScope(true);
					currentScopeLevel --;
				}
				
				return false;
			}
			returnType = expr.getBody().getSymbolData();
			if (returnType == null) {
				returnType = new SymbolType(void.class);
			}
		}
		Map updateMapping = new HashMap();

		SymbolType st = null;

		if (void.class.equals(method.getReturnType())) {
			st = new SymbolType(void.class);
		} else {
			st = SymbolType.valueOf(method.getGenericReturnType(),
					(SymbolType) returnType, updateMapping, null);
		}
		Map aux = new HashMap(
				typeMapping);
		aux.putAll(updateMapping);

		boolean isCompatible = ("void".equals(st.getName()) && (expr.getBody() instanceof ExpressionStmt))
				|| (st.isCompatible((SymbolType) returnType));
		if (isCompatible) {
			expr.setSymbolData(SymbolType.valueOf(method.getDeclaringClass(),
					aux));
		}
		return isCompatible;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy