whole_func_string: function(position) {
          if (!this.arg) {
              return false;
          }
  
          // Note we don't check if position >= this.arg.start because that's
          // implied by the fact that we're asking the assignments in turn, and
          // we want to avoid thing falling between the cracks, but we do need
          // to check that the argument does have a position
          if (this.arg.start === -1) {
              return false;
          }
  
          // We're clearly done if the position is past the end of the text
          if (position > this.arg.end) {
              return false;
          }
  
          // If we're AT the end, the position is captured if either the status
          // is not valid or if there are other valid options including current
          if (position === this.arg.end) {
              return this.conversion.status !== Status.VALID ||
                      this.conversion.predictions.length !== 0;
          }
  
          // Otherwise we're clearly inside
          return true;
      }
func_code_string: function(position) {
          if (!this.arg) {
              return false;
          }
  
          // Note we don't check if position >= this.arg.start because that's
          // implied by the fact that we're asking the assignments in turn, and
          // we want to avoid thing falling between the cracks, but we do need
          // to check that the argument does have a position
          if (this.arg.start === -1) {
              return false;
          }
  
          // We're clearly done if the position is past the end of the text
          if (position > this.arg.end) {
              return false;
          }
  
          // If we're AT the end, the position is captured if either the status
          // is not valid or if there are other valid options including current
          if (position === this.arg.end) {
              return this.conversion.status !== Status.VALID ||
                      this.conversion.predictions.length !== 0;
          }
  
          // Otherwise we're clearly inside
          return true;
      }
func_documentation_string: If the cursor is at 'position', do we have sufficient data to start
  displaying the next hint. This is both complex and important.
  For example, if the user has just typed:<ul>
  <li>'set tabstop ' then they clearly want to know about the valid
  values for the tabstop setting, so the hint is based on the next
  parameter.
  <li>'set tabstop' (without trailing space) - they will probably still
  want to know about the valid values for the tabstop setting because
  there is no confusion about the setting in question.
  <li>'set tabsto' they've not finished typing a setting name so the hint
  should be based on the current parameter.
  <li>'set tabstop' (when there is an additional tabstopstyle setting) we
  can't make assumptions about the setting - we're not finished.
  </ul>
  <p>Note that the input for 2 and 4 is identical, only the configuration
  has changed, so hint display is environmental.
  
  <p>This function works out if the cursor is before the end of this
  assignment (assuming that we've asked the same thing of the previous
  assignment) and then attempts to work out if we should use the hint from
  the next assignment even though technically the cursor is still inside
  this one due to the rules above.