1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.metapath;
28
29 import gov.nist.secauto.metaschema.core.metapath.item.IItem;
30 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
31
32 import java.util.List;
33
34 import edu.umd.cs.findbugs.annotations.NonNull;
35
36 class Let implements IExpression {
37 @NonNull
38 private final Name name;
39 @NonNull
40 private final IExpression boundExpression;
41 @NonNull
42 private final IExpression returnExpression;
43
44 public Let(@NonNull Name name, @NonNull IExpression boundExpression, @NonNull IExpression returnExpression) {
45 super();
46 this.name = name;
47 this.boundExpression = boundExpression;
48 this.returnExpression = returnExpression;
49 }
50
51 @NonNull
52 public Name getName() {
53 return name;
54 }
55
56 @NonNull
57 public IExpression getBoundExpression() {
58 return boundExpression;
59 }
60
61 @NonNull
62 public IExpression getReturnExpression() {
63 return returnExpression;
64 }
65
66 @Override
67 public List<? extends IExpression> getChildren() {
68 return ObjectUtils.notNull(
69 List.of(boundExpression, returnExpression));
70 }
71
72 @Override
73 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
74 return visitor.visitLet(this, context);
75 }
76
77 @Override
78 public ISequence<? extends IItem> accept(DynamicContext dynamicContext, ISequence<?> focus) {
79 ISequence<?> result = getBoundExpression().accept(dynamicContext, focus);
80
81 String name = getName().getValue();
82 dynamicContext.setVariableValue(name, result);
83
84 ISequence<?> retval = getReturnExpression().accept(dynamicContext, focus);
85
86 dynamicContext.clearVariableValue(name);
87
88 return retval;
89 }
90 }