code: private void processChildren(Node n) {
  		for (Node cursor = n.getFirstChild(); cursor != null; cursor = cursor.getNext()) {
  			if (cursor.getType() == Token.CALL) {
  				String hasCondition = NodeUtil.conditionFromHasNode(cursor);
  				if (hasCondition != null) {
  					if (discoveredHasConditions != null) {
  						discoveredHasConditions.add(hasCondition);
  					}
  					Node newNode = null;
  					if (features.contains(hasCondition)) {
  						// features contains the condition being tested.  Replace the call
  						//  with a literal true/false
  						newNode = new Node(features.isFeature(hasCondition) ? Token.TRUE : Token.FALSE);
  						if (log.isLoggable(Level.FINEST))
  							log.finest("Replaced has call for \"" + hasCondition + "\" with " + Boolean.toString(features.isFeature(hasCondition))); //$NON-NLS-1$ //$NON-NLS-2$
  					} else if (this.coerceUndefinedToFalse) {
  						// Not in features means false.
  						newNode = new Node(Token.FALSE);
  						if (log.isLoggable(Level.FINEST))
  							log.finest("Replaced has call for undefined \"" + hasCondition + "\" with false"); //$NON-NLS-1$ //$NON-NLS-2$
  					}
  					if (newNode != null) {
  						cursor.getParent().replaceChild(cursor, newNode);
  						cursor = newNode;
  					}
  				}
  			}
  			if (cursor.hasChildren())
  				processChildren(cursor);
  		}
  	}
docs: /*
  This method walks the AST looking for has calls.  If the condition being tested
  by the has call is specified in the features, then replace the node for the call in
  the AST with a new node for a literal true/false.  We rely on the optimizer to
  detect and remove any resulting dead branches.