*/
// TODO: watch bug 5224: is the context item defined for use in the body expression?
public void typeCheck(ExpressionVisitor visitor) throws XPathException {
GlobalVariable var = getCompiledVariable();
Expression value = var.getSelectExpression();
if (value != null) {
value.checkForUpdatingSubexpressions();
if (value.isUpdatingExpression()) {
throw new XPathException(
"Initializing expression for global variable must not be an updating expression", "XUST0001");
}
value.setContainer(var);
RoleLocator role = new RoleLocator(
RoleLocator.VARIABLE, var.getVariableQName(), 0);
Expression value2 = TypeChecker.strictTypeCheck(
visitor.typeCheck(visitor.simplify(value), AnyItemType.getInstance()),
var.getRequiredType(), role, visitor.getStaticContext());
value2 = value2.optimize(visitor, AnyItemType.getInstance());
var.setSelectExpression(value2);
value2.setContainer(var);
// the value expression may declare local variables
SlotManager map = visitor.getConfiguration().makeSlotManager();
int slots = ExpressionTool.allocateSlots(value2, 0, map);
if (slots > 0) {
var.setContainsLocals(map);
}
if (var.getRequiredType() == SequenceType.ANY_SEQUENCE && !(var instanceof GlobalParam)) {
// no type was declared; try to deduce a type from the value
try {
final TypeHierarchy th = visitor.getConfiguration().getTypeHierarchy();
final ItemType itemType = value.getItemType(th);
final int cardinality = value.getCardinality();
var.setRequiredType(SequenceType.makeSequenceType(itemType, cardinality));
Value constantValue = null;
if (value2 instanceof Literal) {
constantValue = ((Literal)value2).getValue();
}
for (Iterator iter = references.iterator(); iter.hasNext(); ) {