0
|
1 package nabble.naml.compiler;
|
|
2
|
|
3 import java.util.Map;
|
|
4
|
|
5
|
|
6 final class ScopedInterpreterImpl<T> extends InterpreterImpl implements ScopedInterpreter<T> {
|
|
7 private final Map<String,Chunk> dynamicArgs;
|
|
8
|
|
9 ScopedInterpreterImpl(CommandSpec cmdSpec,RunState runState,Map<Class,Integer> inStack,Map<String,?> args,Map<String,Chunk> dynamicArgs) {
|
|
10 super(cmdSpec,runState,inStack,args);
|
|
11 this.dynamicArgs = dynamicArgs;
|
|
12 }
|
|
13
|
|
14 public Object getArg(final T scope,String param) {
|
|
15 if( scope == null )
|
|
16 throw new TemplateRuntimeException("scope is null");
|
|
17 if( !cmdSpec.scopedParameters.contains(param) )
|
|
18 throw new RuntimeException("not scoped parameter");
|
|
19 Chunk chunk = dynamicArgs.get(param);
|
|
20 if( chunk != null ) {
|
|
21 return new BlockWrapper(chunk,runState) {
|
|
22 void printTo(IPrintWriter out) {
|
|
23 int pushed = runState.push(scope);
|
|
24 try {
|
|
25 super.printTo(out);
|
|
26 } finally {
|
|
27 runState.pop(pushed);
|
|
28 }
|
|
29 }
|
|
30 };
|
|
31 }
|
|
32 Object obj = getArg(param);
|
|
33 if( obj != null )
|
|
34 return obj;
|
|
35 if( scope instanceof Primitive )
|
|
36 return scope;
|
|
37 return runState.saveNamespace(scope);
|
|
38 }
|
|
39
|
|
40 public String getArgString(T scope,String param) {
|
|
41 Object val = getArg(scope,param);
|
|
42 return val==null ? null : val.toString();
|
|
43 }
|
|
44
|
|
45 }
|