code: public static String conditionFromHasNode(Node cursor) {
  		if (cursor.getType() == Token.CALL) {
  			// The node is a function or method call
  			Node name, arg;
  			if ((name = cursor.getFirstChild()) != null &&
  					name.getType() == Token.NAME && 		// named function call
  					name.getString().equals("has") && 		// name is "has" //$NON-NLS-1$
  					(arg = name.getNext()) != null &&
  					arg.getType() == Token.STRING && 		// first param is a string literal
  					arg.getNext() == null) 					// only one param
  			{
  				// Ensure that the result of the has function is treated as a
  				// boolean expression.  This is necessary to avoid problems
  				// with code similar to "if (has("ieVersion") < 6)"
  				Node parent = cursor.getParent();
  				int type = parent.getType();
  				switch (type) {
  				case Token.IF:
  				case Token.HOOK:
  				case Token.AND:
  				case Token.OR:
  				case Token.NOT:
  					// these implicitly coerce the result of the function call
  					// to boolean so we don't need to do anything else
  					break;
  
  				default:
  					// Replacing the function call with a boolean value might not
  					// have the desired effects if the code treats the result of
  					// the function as a non-boolean, so don't do anything.
  					return null;
  				}
  
  				return arg.getString();
  			}
  		}
  		return null;
  	}
docs: If the specified node represents a has() function call, then return the
  formal parameter of the function call if it is a string literal, and the
  result of the function call is used as a boolean value.
  
  @param cursor
  the node specifying a has() function call
  @return the feature name (function argument), else null.