view src/nabble/naml/compiler/ScopedInterpreterImpl.java @ 62:4674ed7d56df default tip

remove n2
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 30 Sep 2023 20:25:29 -0600
parents 7ecd1a4ef557
children
line wrap: on
line source

package nabble.naml.compiler;

import java.util.Map;


final class ScopedInterpreterImpl<T> extends InterpreterImpl implements ScopedInterpreter<T> {
	private final Map<String,Chunk> dynamicArgs;

	ScopedInterpreterImpl(CommandSpec cmdSpec,RunState runState,Map<Class,Integer> inStack,Map<String,?> args,Map<String,Chunk> dynamicArgs) {
		super(cmdSpec,runState,inStack,args);
		this.dynamicArgs = dynamicArgs;
	}

	public Object getArg(final T scope,String param) {
		if( scope == null )
			throw new TemplateRuntimeException("scope is null");
		if( !cmdSpec.scopedParameters.contains(param) )
			throw new RuntimeException("not scoped parameter");
		Chunk chunk = dynamicArgs.get(param);
		if( chunk != null ) {
			return new BlockWrapper(chunk,runState) {
				void printTo(IPrintWriter out) {
					int pushed = runState.push(scope);
					try {
						super.printTo(out);
					} finally {
						runState.pop(pushed);
					}
				}
			};
		}
		Object obj = getArg(param);
		if( obj != null )
			return obj;
		if( scope instanceof Primitive )
			return scope;
		return runState.saveNamespace(scope);
	}

	public String getArgString(T scope,String param) {
		Object val = getArg(scope,param);
		return val==null ? null : val.toString();
	}

}