1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.cst;
7   
8   import java.util.List;
9   
10  import dev.metaschema.core.metapath.DynamicContext;
11  import dev.metaschema.core.metapath.IExpression;
12  import dev.metaschema.core.metapath.item.ISequence;
13  import dev.metaschema.core.qname.IEnhancedQName;
14  import dev.metaschema.core.util.CollectionUtil;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  
17  /**
18   * The CST node for a Metapath
19   * <a href="https://www.w3.org/TR/xpath-31/#id-variables">variable
20   * reference</a>.
21   */
22  public class VariableReference
23      extends AbstractExpression {
24    @NonNull
25    private final IEnhancedQName name;
26  
27    /**
28     * Construct a new Metapath variable reference CST node.
29     *
30     * @param text
31     *          the parsed text of the expression
32     * @param name
33     *          the variable name
34     */
35    public VariableReference(
36        @NonNull String text,
37        @NonNull IEnhancedQName name) {
38      super(text);
39      this.name = name;
40    }
41  
42    /**
43     * Get the variable name.
44     *
45     * @return the variable name
46     */
47    @NonNull
48    public IEnhancedQName getName() {
49      return name;
50    }
51  
52    @Override
53    public List<? extends IExpression> getChildren() {
54      return CollectionUtil.emptyList();
55    }
56  
57    @SuppressWarnings("null")
58    @Override
59    public String toCSTString() {
60      return String.format("%s[name=%s]", getClass().getName(), getName());
61    }
62  
63    @Override
64    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
65      return visitor.visitVariableReference(this, context);
66    }
67  
68    @Override
69    protected ISequence<?> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
70      return dynamicContext.getVariableValue(getName());
71    }
72  }