public class ExpressionTool extends Object
Modifier and Type | Class and Description |
---|---|
static interface |
ExpressionTool.ExpressionPredicate |
static interface |
ExpressionTool.ExpressionSelector
Callback for selecting expressions in the tree
|
Modifier and Type | Field and Description |
---|---|
static int |
CALL_EVALUATE_ITEM |
static int |
EVALUATE_AND_MATERIALIZE_VARIABLE |
static int |
EVALUATE_SUPPLIED_PARAMETER |
static int |
EVALUATE_VARIABLE |
static int |
ITERATE_AND_MATERIALIZE |
static int |
LAZY_TAIL_EXPRESSION |
static int |
MAKE_CLOSURE |
static int |
MAKE_INDEXED_VARIABLE |
static int |
MAKE_MEMO_CLOSURE |
static int |
MAKE_SINGLETON_CLOSURE |
static int |
NO_EVALUATION_NEEDED |
static int |
PROCESS |
static int |
RETURN_EMPTY_SEQUENCE |
static int |
SHARED_APPEND_EXPRESSION |
static int |
UNDECIDED |
Modifier and Type | Method and Description |
---|---|
static int |
allocateSlots(Expression exp,
int nextFree,
SlotManager frame)
Allocate slot numbers to range variables
|
static boolean |
callsFunction(Expression exp,
StructuredQName qName)
Determine whether an expression contains a call on the function with a given fingerprint
|
static boolean |
changesXsltContext(Expression exp)
Determine whether an expression possible calls (directly or indirectly) xsl:result-document, or
has other context dependencies that prevent function inlining,
which we assume is true if it contains a template call.
|
static boolean |
contains(Expression exp,
boolean sameFocusOnly,
ExpressionTool.ExpressionPredicate predicate)
Test whether a given expression is, or contains, at any depth, an expression that satisfies a supplied
condition
|
static boolean |
containsLocalParam(Expression exp)
Determine whether an expression contains a LocalParamSetter subexpression
|
static boolean |
containsSubexpression(Expression exp,
Class<? extends Expression> subClass)
Determine whether an expression has a subexpression of a given implementation class
|
static void |
copyLocationInfo(Expression from,
Expression to)
Copy location information (the line number and reference to the container) from one expression
to another
|
static boolean |
dependsOnFocus(Expression exp)
Ask whether an expression has a dependency on the focus
|
static boolean |
dependsOnVariable(Expression exp,
Binding[] bindingList)
Determine whether an expression depends on any one of a set of variables
|
static Sequence |
eagerEvaluate(Expression exp,
XPathContext context)
Evaluate an expression now; lazy evaluation is not permitted in this case
|
static int |
eagerEvaluationMode(Expression exp)
Determine the method of evaluation to be used when lazy evaluation of an expression is
preferred.
|
static void |
ebvError(String reason)
Report an error in computing the effective boolean value of an expression
|
static boolean |
effectiveBooleanValue(Item item)
Determine the effective boolean value of a single item
|
static boolean |
effectiveBooleanValue(SequenceIterator iterator)
Determine the effective boolean value of a sequence, given an iterator over the sequence
|
static Sequence |
evaluate(Expression exp,
int evaluationMode,
XPathContext context,
int ref)
Do lazy evaluation of an expression.
|
static int |
expressionSize(Expression exp)
Get the size of an expression tree (the number of subexpressions it contains)
|
static boolean |
factorOutDot(Expression exp,
Binding variable)
Replace references to the context item with references to a variable
|
static void |
gatherCalledFunctionNames(Expression e,
List<SymbolicName> list)
Gather a list of the names of the user-defined functions which a given expression calls directly
|
static void |
gatherCalledFunctions(Expression e,
List<UserFunction> list)
Gather a list of all the user-defined functions which a given expression calls directly
|
static void |
gatherReferencedVariables(Expression e,
List<Binding> list)
Gather a list of all the variable bindings on which a given expression depends
|
static void |
gatherVariableReferences(Expression exp,
Binding binding,
List<VariableReference> list)
Get a list of all references to a particular variable within a subtree
|
static URI |
getBaseURI(StaticContext env,
SourceLocator locator,
boolean fail)
Determine the base URI of an expression, so that it can be saved on the expression tree for use
when the expression is evaluated
|
static String |
getCurrentDirectory() |
static int |
getReferenceCount(Expression exp,
Binding binding,
boolean inLoop)
Determine how often a variable is referenced.
|
static String |
indent(int level)
Construct indent string, for diagnostic output
|
static boolean |
inlineVariableReferences(Expression expr,
Binding binding,
Expression replacement)
Inline variable references.
|
static boolean |
isAllowedInUpdatingContext(Expression exp)
Determine whether the expression is either an updating expression, or an expression that is permitted
in a context where updating expressions are allowed
|
static Sequence |
lazyEvaluate(Expression exp,
XPathContext context,
int ref)
Do lazy evaluation of an expression.
|
static int |
lazyEvaluationMode(Expression exp)
Determine the method of evaluation to be used when lazy evaluation of an expression is
preferred.
|
static Expression |
make(String expression,
StaticContext env,
Container container,
int start,
int terminator,
int lineNumber,
CodeInjector codeInjector)
Parse an XPath expression.
|
static Expression |
makePathExpression(Expression start,
Expression step,
boolean sortAndDeduplicate)
Make a mapping expression.
|
static int |
markTailFunctionCalls(Expression exp,
StructuredQName qName,
int arity)
Scan an expression to find and mark any recursive tail function calls
|
static String |
parenthesize(Expression exp)
Display an expression adding parentheses if it is possible they are necessary
because the expression has sub-expressions
|
static void |
rebindVariableReferences(Expression exp,
Binding oldBinding,
Binding newBinding)
Rebind all variable references to a binding
|
static boolean |
refersToVariableOrFunction(Expression exp)
Determine whether the expression contains any variable references or calls to user-written functions
|
static boolean |
replaceCallsToCurrent(Expression expr,
LocalBinding binding)
Replace calls to current() by a variable reference.
|
static void |
replaceNthSubexpression(Expression target,
int n,
Expression replacement)
Replace the Nth subexpression of an expression
|
static boolean |
replaceSelectedSubexpressions(Expression exp,
ExpressionTool.ExpressionSelector selector,
Expression replacement)
Replace all selected subexpressions within a subtree
|
static boolean |
replaceVariableReferences(Expression exp,
Binding binding,
Expression replacement)
Replace all references to a particular variable within a subtree
|
static void |
resetPropertiesWithinSubtree(Expression exp)
Reset cached static properties within a subtree, meaning that they have to be
recalulated next time they are required
|
static Expression |
resolveCallsToCurrentFunction(Expression exp)
Resolve calls to the XSLT current() function within an expression
|
static Expression |
tryToFactorOutDot(Expression exp,
ItemType contextItemType)
Try to factor out dependencies on the context item, by rewriting an expression f(.) as
let $dot := .
|
static Expression |
unfilteredExpression(Expression exp,
boolean allowPositional)
Get the expression that remains after removing any filter predicates
|
static Expression |
unsortedIfHomogeneous(Expression exp,
boolean forStreaming)
Remove unwanted sorting from an expression, at compile time, if and only if it is known
that the result of the expression will be homogeneous (all nodes, or all atomic values).
|
public static final int UNDECIDED
public static final int NO_EVALUATION_NEEDED
public static final int EVALUATE_VARIABLE
public static final int MAKE_CLOSURE
public static final int MAKE_MEMO_CLOSURE
public static final int RETURN_EMPTY_SEQUENCE
public static final int EVALUATE_AND_MATERIALIZE_VARIABLE
public static final int CALL_EVALUATE_ITEM
public static final int ITERATE_AND_MATERIALIZE
public static final int PROCESS
public static final int LAZY_TAIL_EXPRESSION
public static final int SHARED_APPEND_EXPRESSION
public static final int MAKE_INDEXED_VARIABLE
public static final int MAKE_SINGLETON_CLOSURE
public static final int EVALUATE_SUPPLIED_PARAMETER
public static Expression make(String expression, StaticContext env, Container container, int start, int terminator, int lineNumber, CodeInjector codeInjector) throws XPathException
expression
- The expression (as a character string)env
- An object giving information about the compile-time
context of the expressioncontainer
- The expression's containerstart
- position of the first significant character in the expressionterminator
- The token that marks the end of this expression; typically
Token.EOF, but may for example be a right curly bracelineNumber
- the line number of the start of the expressioncodeInjector
- true allows injection of tracing, debugging, or performance monitoring code; null if
not requiredXPathException
- if the expression contains a static errorpublic static void copyLocationInfo(Expression from, Expression to)
from
- the expression containing the location informationto
- the expression to which the information is to be copiedpublic static Expression unsortedIfHomogeneous(Expression exp, boolean forStreaming) throws XPathException
exp
- the expression to be optimizedforStreaming
- true if streamed evaluation of the expression is requiredXPathException
- if a static error is found while doing the rewritepublic static int lazyEvaluationMode(Expression exp)
exp
- the expression to be evaluatedpublic static int eagerEvaluationMode(Expression exp)
exp
- the expression to be evaluatedpublic static Sequence evaluate(Expression exp, int evaluationMode, XPathContext context, int ref) throws XPathException
exp
- the expression to be evaluatedevaluationMode
- the evaluation mode for this expressioncontext
- the run-time evaluation context for the expression. If
the expression is not evaluated immediately, then parts of the
context on which the expression depends need to be saved as part of
the Closureref
- an indication of how the value will be used. The value 1 indicates that the value
is only expected to be used once, so that there is no need to keep it in memory. A small value >1
indicates multiple references, so the value will be saved when first evaluated. The special value
FILTERED indicates a reference within a loop of the form $x[predicate], indicating that the value
should be saved in a way that permits indexing.XPathException
- if any error occurs in evaluating the
expressionpublic static Sequence lazyEvaluate(Expression exp, XPathContext context, int ref) throws XPathException
exp
- the expression to be evaluatedcontext
- the run-time evaluation context for the expression. If
the expression is not evaluated immediately, then parts of the
context on which the expression depends need to be saved as part of
the Closureref
- an indication of how the value will be used. The value 1 indicates that the value
is only expected to be used once, so that there is no need to keep it in memory. A small value >1
indicates multiple references, so the value will be saved when first evaluated. The special value
FILTERED indicates a reference within a loop of the form $x[predicate], indicating that the value
should be saved in a way that permits indexing.XPathException
- if any error occurs in evaluating the
expressionpublic static Sequence eagerEvaluate(Expression exp, XPathContext context) throws XPathException
exp
- the expression to be evaluatedcontext
- the run-time evaluation contextXPathException
- if any dynamic error occurs evaluating the
expressionpublic static int markTailFunctionCalls(Expression exp, StructuredQName qName, int arity)
exp
- the expression to be analyzedqName
- the name of the containing functionarity
- the arity of the containing functionpublic static String indent(int level)
level
- the indentation level (the number of spaces to return)public static boolean containsLocalParam(Expression exp)
exp
- the expression to be testedpublic static boolean contains(Expression exp, boolean sameFocusOnly, ExpressionTool.ExpressionPredicate predicate)
exp
- the given expressionsameFocusOnly
- if true, only subexpressions evaluated in the same focus are searched. If false,
all subexpressions are searchedpredicate
- the condition to be satisfiedpublic static boolean changesXsltContext(Expression exp)
exp
- the expression to be testedpublic static int allocateSlots(Expression exp, int nextFree, SlotManager frame)
exp
- the expression whose range variables need to have slot numbers assignednextFree
- the next slot number that is available for allocationframe
- a SlotManager object that is used to track the mapping of slot numbers
to variable names for debugging purposes. May be null.public static boolean effectiveBooleanValue(SequenceIterator iterator) throws XPathException
iterator
- An iterator over the sequence whose effective boolean value is requiredXPathException
- if a dynamic error occurspublic static boolean effectiveBooleanValue(Item item) throws XPathException
item
- the item whose effective boolean value is requiredXPathException
- if a dynamic error occurspublic static void ebvError(String reason) throws XPathException
reason
- the nature of the errorXPathException
- alwayspublic static boolean dependsOnFocus(Expression exp)
exp
- the expressionpublic static boolean dependsOnVariable(Expression exp, Binding[] bindingList)
exp
- the expression being testedbindingList
- the set of variables being testedpublic static void gatherReferencedVariables(Expression e, List<Binding> list)
e
- the expression being testedlist
- a list to which the bindings are to be added. The items in this list must
implement Binding
public static boolean refersToVariableOrFunction(Expression exp)
exp
- the expression being testedpublic static boolean callsFunction(Expression exp, StructuredQName qName)
exp
- The expression being testedqName
- The name of the functionpublic static boolean containsSubexpression(Expression exp, Class<? extends Expression> subClass)
exp
- The expression being testedsubClass
- The impementation class of the sought subexpressionpublic static void gatherCalledFunctions(Expression e, List<UserFunction> list)
e
- the expression being testedlist
- a list of the functions that are called. The items in this list must
be objects of class UserFunction
public static void gatherCalledFunctionNames(Expression e, List<SymbolicName> list)
e
- the expression being testedlist
- a list of the functions that are called. The items in this list are strings in the format
"{uri}local/arity"public static void resetPropertiesWithinSubtree(Expression exp)
exp
- the root of the subtree within which static properties should be resetpublic static Expression resolveCallsToCurrentFunction(Expression exp) throws XPathException
exp
- the expression within which calls to current() should be resolvedXPathException
- if a static error is detectedpublic static void gatherVariableReferences(Expression exp, Binding binding, List<VariableReference> list)
exp
- the expression at the root of the subtreebinding
- the variable binding whose references are soughtlist
- a list to be populated with the references to this variablepublic static boolean replaceSelectedSubexpressions(Expression exp, ExpressionTool.ExpressionSelector selector, Expression replacement)
exp
- the expression at the root of the subtreeselector
- callback to determine whether a subexpression is selectedreplacement
- the expression to be used in place of the variable referencepublic static boolean replaceVariableReferences(Expression exp, Binding binding, Expression replacement)
exp
- the expression at the root of the subtreebinding
- the variable binding whose references are soughtreplacement
- the expression to be used in place of the variable referencepublic static int getReferenceCount(Expression exp, Binding binding, boolean inLoop)
exp
- the expression within which variable references are to be countedbinding
- identifies the variable of interestinLoop
- true if the expression is within a loop, in which case a reference counts as many.
This should be set to false on the initial call, it may be set to true on an internal recursive
callpublic static int expressionSize(Expression exp)
exp
- the expression whose size is requiredpublic static void rebindVariableReferences(Expression exp, Binding oldBinding, Binding newBinding)
exp
- the expression whose contained variable references are to be reboundoldBinding
- the old binding for the variable referencesnewBinding
- the new binding to which the variables should be reboundpublic static Expression makePathExpression(Expression start, Expression step, boolean sortAndDeduplicate)
start
- the start expression (the first operand of "/")step
- the step expression (the second operand of "/")sortAndDeduplicate
- set to true if this is a path expression ("/") where the result needs to be
homogenous, and needs to be sorted and deduplicated if it consists of nodes. Set to false if the caller
knows that this is not necessary (typically because it has already been checked).public static Expression unfilteredExpression(Expression exp, boolean allowPositional)
exp
- the expression to be examinedallowPositional
- true if positional predicates are allowedpublic static Expression tryToFactorOutDot(Expression exp, ItemType contextItemType)
exp
- the expression from which references to "." should be factored out if possiblecontextItemType
- the static type of the context itempublic static boolean factorOutDot(Expression exp, Binding variable)
exp
- the expression in which the replacement is to take placevariable
- the declaration of the variablepublic static boolean inlineVariableReferences(Expression expr, Binding binding, Expression replacement)
expr
- the expression containing the variable references to be inlinedbinding
- the variable binding to be inlinedreplacement
- the expression to be used as a replacement for the variable referencepublic static boolean replaceCallsToCurrent(Expression expr, LocalBinding binding)
expr
- the expression potentially containing the calls to be replacedbinding
- the variable binding to be referencedpublic static boolean isAllowedInUpdatingContext(Expression exp)
exp
- the expression under testpublic static void replaceNthSubexpression(Expression target, int n, Expression replacement)
target
- the parent expression whose subexpression is to be replacedn
- the index of the subexpression to be replaced (starting at zero)replacement
- the replacement subexpressionpublic static String getCurrentDirectory()
public static URI getBaseURI(StaticContext env, SourceLocator locator, boolean fail) throws XPathException
env
- the static contextlocator
- location of the expression for error messagesfail
- if true, the method throws an exception when there is no absolute base URI; otherwise, the
method returns nullXPathException
- if an error occurspublic static String parenthesize(Expression exp)
exp
- the exprssion to be displayedCopyright (c) 2004-2014 Saxonica Limited. All rights reserved.