view src/nabble/naml/compiler/JavaCall.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.naml.compiler;

import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

import java.util.Collection;


final class JavaCall implements Call {
	final JavaCommand javaCommand;
	final int iStack;

	JavaCall(JavaCommand javaCommand,int iStack) {
		this.javaCommand = javaCommand;
		this.iStack = iStack;
	}

	@Override public Collection<String> getRequiredNamespaces() {
		return javaCommand.getRequiredNamespaces();
	}

	Object invoke(RunState runState, Object... args)
		throws IllegalAccessException, InvocationTargetException
	{
		Object obj = javaCommand.isStatic ? null : runState.getFromStack(iStack);
		return javaCommand.method.invoke(obj,args);
	}

	Method getMethod() {
		return javaCommand.method;
	}

	boolean isScoped() {
		return javaCommand.scopedType != null;
	}

	boolean isScoped(String param) {
		return isScoped() && javaCommand.cmdSpec.hasScopedParam(param);
	}

	Class scopedType() {
		return javaCommand.scopedType;
	}

	String getJavaName() {
		return javaCommand.method.getName();
	}

	public String toString() {
		return javaCommand.method.toString() + " - stack index "+iStack;
	}

	String name() {
		return javaCommand.name;
	}

	CommandSpec cmdSpec() {
		return javaCommand.cmdSpec;
	}

	Method method() {
		return javaCommand.method;
	}

	@Override public boolean equals(Object obj) {
		if( !(obj instanceof JavaCall) )
			return false;
		JavaCall jc = (JavaCall)obj;
		return jc.javaCommand==javaCommand && jc.iStack==iStack;
	}

	@Override public int hashCode() {
		return iStack*31 + javaCommand.hashCode();
	}

}