diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/naml/compiler/JavaCall.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,76 @@
+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();
+	}
+
+}